Ajuda em Retorno covariante

4 respostas
T
Bom dia galera. Olha, estou estudando sobrescrita de métodos e classes e apareceu um tal de retorno covariante. Não estou conseguindo entender muito bem sua funcionalidade. Eu sei um exemplo:
// classe pai
public Object método(){
   // ações do método
   return "";
}

// classe filha
public String método(){
   // ações do método
   return "";
}

Isso eu entendi, String é filha de Object e o retorno é o mesmo, aí funciona...
Mas como eu faria se um método fosse do tipo Animal e outro Canguru?

Não sei se isso tem lógica, espero que sim, mas mesmo assim aguardo respostas.
Valeu.

4 Respostas

rmendes08

De maneira direta, retorno covariante só funciona se o tipo de retorno na classe filha é um subtipo do tipo de retorno na classe pai. Pense que a versão do método na classe pai tem que “encapar” completamente o método na classe filha.

T

Poderia dar um exemplo? Além do que eu falei?

douglaskd

vou te dar um exemplo:

public class Animal {
	
	public Animal getCanguru(){
		
		return new Canguru();
	}

}
public class Canguru extends Animal{

	public Canguru getCanguru(){
		
		return new Canguru();
	}
	
}

isso só funciona por que na Classe Canguru tem o extends, então na classe Animal, quando eu utilizo a classe canguru, a classe Animal identifica que a classe canguru é uma classe também do tipo Animal,

imaginemos sua utilidade:

quero retornar apenas 1 lista de vários tipos de animais e cada um vai imprimir um texto diferente quando eu mostrar na tela.... como vc faria isso?

listadeAnimais.add(canguru),
listadeAnimais.add(elefante),

como uma lista pode aceitar 2 tipos de objetos diferentes ???

na hora de imprimir você da o CAST do tipo de objeto Pai....

esta ai sua utilidade,

TESTES:
remova o extends, e olhe o que acontece...
retorne um Animal no método do canguru:

public Animal getCanguru(){
		
		return new Canguru();
	}

coloque vários animais diferentes em uma lista e tente imprimi-los

debugue o código

T
douglaskd:
vou te dar um exemplo:
public class Animal {
	
	public Animal getCanguru(){
		
		return new Canguru();
	}

}
public class Canguru extends Animal{

	public Canguru getCanguru(){
		
		return new Canguru();
	}
	
}

isso só funciona por que na Classe Canguru tem o extends, então na classe Animal, quando eu utilizo a classe canguru, a classe Animal identifica que a classe canguru é uma classe também do tipo Animal,

imaginemos sua utilidade:

quero retornar apenas 1 lista de vários tipos de animais e cada um vai imprimir um texto diferente quando eu mostrar na tela.... como vc faria isso?

listadeAnimais.add(canguru),
listadeAnimais.add(elefante),

como uma lista pode aceitar 2 tipos de objetos diferentes ???

na hora de imprimir você da o CAST do tipo de objeto Pai....

esta ai sua utilidade,

TESTES:
remova o extends, e olhe o que acontece...
retorne um Animal no método do canguru:

public Animal getCanguru(){
		
		return new Canguru();
	}

coloque vários animais diferentes em uma lista e tente imprimi-los

debugue o código

Obrigado, entendi.
Até a próxima.

Criado 23 de abril de 2012
Ultima resposta 23 de abr. de 2012
Respostas 4
Participantes 3