[RESOLVIDO] Dúvida em questão de retorno covariante

Eae pessoal, blz?

Seguinte, não consigo entender o resultado do código abaixo:

class A {
	int x = 5;
}

class B extends A {
	int x = 6;
}

public class CovariantReturnTest {
	
	public A getObject() {
		return new A();
	}

}

class SubCovariantReturnTest extends CovariantReturnTest {
	
	public B getObject() {
		return new B();
	}
	
	public static void main (String[] args) {
		CovariantReturnTest c1 = new SubCovariantReturnTest();
		System.out.println(c1.getObject().x);
	}
	
}

O resultado é 5, mas por que não 6?

Quando utilizamos retorno covariante o Java não faz a ligação dinâmica?

Valeu!

Usa sim.
Mas a ligação dinâmica serve para métodos, não para atributos.

Substitua para um método getX() e você verá o resultado correto.

Portanto, o problema que você está vendo não tem absolutamente nada a ver com o fato do retorno ser ou não covariante.

Bom exemplo,

Como variáveis não são sobreescritas, quando vc retorna a referencia B para uma instância A, a JVM pega a variavel da instancia (A) e não do corrente objeto (B)

Tente esse código para ficar mais claro:

class A{
	public int x = 10;
}
class B extends A{
	public int x = 200;
}
class Test{
	public static void main(String[] args){
		A a = new B();
		System.out.println(a.x);
	}
}

Espero ter ajudado.

Abraços
<><

O Vinny falou corretamente, não tem nada ver com retorno covariante,

Abraços
<><

Fala pessoal,

putzzzzz, é verdade, agora eu entendi. É que a maneira como o código foi escrito que leva a dúvida hehehe. Essas questões de certificação são chatas d+ hehehe.

Valeu pessoal.

[]'s

Sempre que você ver um atributo de uma classe sendo manipulado, olhe para a referencia da variável, ai vc nunca erra :smiley:

Só pra constar, o método chamado foi o de B, porém o atributo impresso foi o de A pelos motivos explicados acima!