Overriding using a covariant return type!

7 respostas
L

Olá a todos!

Sou novo aqui no fórum e estou estudando para tirar a certificação…

Estou com o livro da Kathy Sierra e no capítulo de OO fiquei com uma dúvida e gostaria de saber se alguém aqui sabe responder.

Observem o código:

class Programmer {
   Programmer debug() { return this; }
}
class SCJP extends Programmer {
   Object debug() { return this; }

   public static void main(String [] args) {
      SCJP a = new SCJP();
      System.out.println("Teste = " + a instanceof Object); 
   }
}

Se SCJP é instância de Object, pq eu não posso sobrescrever o método usando como retorno o tipo Object?

Espero ter sido claro nesta minha primeira dúvida!

uma abraço,

7 Respostas

H

Se não me falhe a memória tu não podes sobrescrever Programmer debug() { return this; } com Object debug() { return this; } porque Object não extende Programmer. Porém esta correto vc retornar um SCJP para um Object porque SCJP É-UM Object.

Rafael_Nunes

Preste atenção n o retorno do método debug.

Todo Programmer é um Object, mas nem todo Object é um Programmer. No método da classe você poderia retornar uma String, que também é um Object, mas String não tem relação nenhuma com o Programmer definido no método debug da classe pai.
Para que haja uma sobreescrita, você deve respeitar a assinatura do método da classe pai, e neste caso, utilizando covariância, na classe pai deveria retornar um Object, e na classe filha retornar qualquer sub-tipod e Object

L

Obrigado Rafael e Higor!

Foi bobeira minha mesmo…
Eu tinha entendido que eu poderia retornar tanto SCJP ou Programmer no método, mas não tinha sacado que nem todo Object é um SCPJ ou Programmer…

Vou tentar uma mais difícil na próxima!

obrigado!

Raff

lavaliante:

Olá a todos!

Sou novo aqui no fórum e estou estudando para tirar a certificação…

Estou com o livro da Kathy Sierra e no capítulo de OO fiquei com uma dúvida e gostaria de saber se alguém aqui sabe responder.

Observem o código:

class Programmer {
   Programmer debug() { return this; }
}
class SCJP extends Programmer {
   Object debug() { return this; }

   public static void main(String [] args) {
      SCJP a = new SCJP();
      System.out.println("Teste = " + a instanceof Object); 
   }
}

Se SCJP é instância de Object, pq eu não posso sobrescrever o método usando como retorno o tipo Object?

Espero ter sido claro nesta minha primeira dúvida!

uma abraço,

lembre-se de retorno covariante…

LPJava

do maior para o menor nao pode!! :smiley: Um pai nao pode ser filho do filho. Seu pai nao pode ser seu filho :smiley:

retorno covariante tem q passar no teste É-UM.

B

Não sabia dessa.

Então é válido ter um overriding em que o médodo classe filha altere o tipo de retorno para um objeto que passe no teste É-UM? Mesmo na versão 1.4?

victorwss

Retorno covariante é uma coisa do java 5 para cima. No java 1.4 o método da subclasse tem que ter EXATAMENTE o mesmo retorno do método da superclasse.

Criado 13 de fevereiro de 2008
Ultima resposta 15 de fev. de 2008
Respostas 7
Participantes 7