Covariante

1 resposta
M
Não entendi muito bem esse exemplo. Sei que o polimorfismo  funciona para métodos e não para variáveis.

ex:

class A{

int x=5;

public int teste(){

return x;

}}

class B extends A{

int x=6;

public int teste(){

return x;

}}

public class Teste{

public static void main(String args[]){

A a=new B();

System.out.println(a.x); // imprime 5

System.out.println(a.teste()); // imprime 6
beleza!! mas esse outro está muito confuso

ex:

class A{

int x=5;

}

class B extends A{

int x=6;

}

public class CovariantTest{

public A gerObject(){

return new A();

}

public static void main(String args[]){

CovariantTest c=new SubCovariantTest();

System.out.print(c.getObject().x);  // imprime 5

}

}
class SubCovariantTest extends CovariantTest{

public B getObject(){

return new B();

}

}

Minha dúvida é a seguinte.
Quando chamo c.getObject(), estou chamando o método da class SubCovariantTest que retorna um objeto B. Correto?
Porque quando chamo c.getObject().x ele retorna o valor de x da class CovarianteTest se o retorno do método é um objeto B?

Alguém pode me explicar?

1 Resposta

ViniGodoy

Antes de mais nada, use a tag code, como descrito aqui:
http://www.guj.com.br/posts/list/50115.java

Esse não é um problema de covariantes e sim de shadowing.

Apenas métodos são sujeitos a polimorfismo, não os atributos. Embora getObject() retorne uma instância de B, ele está sendo referenciado pelo tipo A.

Como o atributo é visto estaticamente, sem polimorfismo, quem vai ser impresso é o x de A, não de B. Outro motivo para não ferir o encapsulamento.

Criado 1 de julho de 2007
Ultima resposta 1 de jul. de 2007
Respostas 1
Participantes 2