Duvida - Retornos covariantes [aquela ajuda do thingol ou do Mantu seriam imensamente bem vindas..]

Bom dia,

Uma dúvida que encontrei no Whizlabs, sobre retornos covariantes. Qual a regra para determinar qual método será invocado? Se fosse um caso normal de herança, o método invocado seria o da instancia, porém como essa história funciona no caso dos covariantes?

[]'s

class A {
	
	int x = 2;
}


class B extends A{
	
	int x = 1;
}

public class ExemploCovariante {

	public A getObject(){
		return new A();
	}
	
	public static void main(String[] args) {
		
		ExemploCovariante e = new ExemploCovarianteDerivada();
		e.getObject();

	}

}

class ExemploCovarianteDerivada extends ExemploCovariante {
	
	public B getObject(){
		return new B();
	}
	
	
}

ele retorna da filha veja o exemplo abaixo:

public class VarRetorn {

	 Object vaca(){
		return new String("vaca preta");
	}
	public static void main(String[] args) {
		VarRetorn vr = new VarR();
		System.out.println(	vr.vaca());
	}
}

class VarR extends VarRetorn{
	String vaca(){
		return new String("vaca braca");
	}
}

pq em tempo de execucao ele ver que o metodo foi subscrito… entao ele vai chamar do objeto!!

Nesse caso ele vai fazer polimorfismo normal. ou seja vai chamar public B getObject(){}

A coisa fica mais interessante se vc considerar o código abaixo


 class A {
	 	int x = 2;
	 }  
	   
	   
	 class B extends A{
		 int x = 1;
	 }  
	 	 
	   
	 public class ExemploCovariante {  
	   
	     public A getObject(){  
	         return new A();  
	     }  
	     
	       
	     public static void main(String[] args) {  
	           
	         ExemploCovariante e = new ExemploCovarianteDerivada();
	         System.out.println(e.getObject().x); // Mostra 1 ou 2 ?
	     }  
	   
	 }  
	   
	 class ExemploCovarianteDerivada extends ExemploCovariante {  
	       
	     public B getObject(){  
	         return new B();  
	     }  
	 }

imprime 2 ja que variaveis e tb quando houver o modificador static é chamado pelo tipo da referencia.

Na verdade ele imprime 2 porque variaveis não sofrem sobrecarga =)

tb tem essa caracteristica! :smiley: