Covariant return types

18 respostas
P

Pessoal,

fazendo um simulado aqui me deparei com isso:

“Covariant return types allow the subclass method to return a subclass of the return type of the superclass method”

nao entendi mto bem…

alguem poderia dar exemplos?

18 Respostas

LPJava

retorna um tipo que filho da superclass.

class Animal{
Animal raca(){
return null;}
}
class Dog extends Animal{
Dog raca(){
return null;}
}

Posso subscrever meu metodo com o tipo de retorno… desde que ele passe no teste É-UM.

J

Mais um exemplo…

class A{ public A testar(){ System.out.println("método da superclasse"); return null; } } class B extends A{ public B testar(){ //retorno covariante System.out.println("método da subclasse"); return null; } } class Teste{ public static void main(String [] args){ A a = new A(); B b = new B(); A x = new B(); //referência do tipo A para um objeto do tipo B (OK, B passa no teste é um para A) a.testar(); b.testar(); x.testar(); //polimorfismo em ação } }
Preste atenção no tipo de retorno na assinatura do método testar nas classes A e B, o tipo de retorno declarado do método da classe B é um subtipo do tipo de retorno declarado do método da classe A (class B extends A). Se quiser copie o código e execute-o, veja o resultado e depois se quiser modifique-o e faça seus próprios testes.

anderson.bonavides

Saída:
método da superclasse
método da subclasse
método da subclasse

Eu pensei que retorno covariante tinha haver com isso:

<blockquote>public B testar(){ //retorno covariante

System.out.println(“método da subclasse”);

return new B();

}</blockquote>

Se isso não é retorno covariante o que seria?

Raff

anderson isso é retorno covariante sim… se você tiver uma superClasse A que tenha um metodo public A testar(){ return new A(); } e um subclasse B, com um metodo subscrito dessa maneira… public B testar(){ return new B();}
O retorno covariante diz que aceita qualquer sub tipo do metodo original da superClass

Raff
public inteface Animal{
 
Animal comer();

}

class Dog implements Animal{

 public Dog comer(){

   new Dog();
   
}
 
}

Acha que isso é um retorno cavariante ???

Raff

melhor dizendo acha que isso é uma subscrição válida ?

Raff

como assim amigo… isso daria erro não ? Supondo de A é superCLasse e B e SubClasse ?

P

Raff:

Seria o mesmo que: B b = new A();

como assim amigo… isso daria erro não ? Supondo de A é superCLasse e B e SubClasse ?

dá erro sim…

P
everson_z:
No método raca(); é esperado a classe pai mas retorno o filho!

Seria o mesmo que: B b = new A();

class Animal{  
    	   
    	   	Animal raca(){  
    		   	return null;
    	   	}  
    	}  
       
    	class Dog extends Animal{  
    	
    		Animal raca(){  
    			return new Dog();
    		
    		}  
    	}

caramba, cada um postando uma coisa... :?

isso seria a mesma coisa?!
class Dog extends Animal{  
    	
    		Dog raca(){  
    			return new Dog();
    		
    		}  
    	}

ou TEM que manter o tipo de retorno como sendo da superclasse?

anderson.bonavides

No meu entendimento isso seria só Polimofismo.

class A{ public A testar(){ System.out.println("método da superclasse"); return null; } } class B extends A{ public B testar(){ //retorno covariante System.out.println("método da subclasse"); return null; } } class Teste{ public static void main(String [] args){ A x = new B(); //referência do tipo A para um objeto do tipo B (OK, B passa no teste é um para A) x.testar(); //polimorfismo em ação } }

E isso seria retorno covariante.

<blockquote>public Dog comer(){

new Dog();

}   </blockquote>
Raff

Eu tbm acho anderson !!!

LPJava

tem certeza disso?

entao pq isso nao compila:

class X{
public int soma(){return 0;}
}
class Y extends X{
public short soma(){return 0;}
}

bom sabemos que short é um inteiro… posso colocar um short dentro de um inteiro, e um inteiro dentro de um long mais pq isso nao funciona?

E outra retorno covariantes faz parte do polimorfismo…

flw!

anderson.bonavides

Isso não compila:

class X{   
public int soma(){return 0;}   
}   
class Y extends X{   
public short soma(){return 0;}   
}

Mais isso compila: class X{ public int soma(){return 0;} } class Y extends X{ public int soma(){return 0;} }

Isso não trata de retorno covariante e sim de sobrescrição inválida. Quando vc muda o tipo vc está quebrando as regras da subscrição que diz q o metodo tem permanecer o mesmo e o tipo de retorno tem que ser mais publico que neste caso não tem como ser mais publico já que public é o mais publico de todos.

1.public
2.protected
3.default
4.private

public abstract class Animal{...}
public class Bear extends Animal{...}
         public class Test{
                  public Animal go(){
                            return new Bear(); //Bear passa no teste é um. 
                                                         //Isso é um retorno covariante.
                  }
                  public Animal go2{ 
                           return null; //Tambem é válido. 
                                      //Mas para funcionar o método tem que ter um tipo de retorno
                                      //uma referência a um objeto.
                  }
}
neohacker

class X{ public int soma(){return 0;} } class Y extends X{ public short soma(){return 0;} }

Isso não compila porque não é um overrinding válido … covariante é somenta para Objetos …

Quanto a questão de Covariant …
É permitido retornar uma subclasse … IS-A

class Animal{  
    	   
    	   	Animal raca(){  
    		   	return null;
    	   	}  
    	}  
       
    	class Dog extends Animal{  
    	
    		Dog raca(){  
    			return new Dog();
    		
    		}  
    	}
Raff

NeoHacker você tem razão, não sei por que o Camilo coloco tipo primitivos ai… não entendi Camilo !

D

Nossa pessoal… vamos nos limitar as questões as quais temos pleno conhecimento?

Esse tópico foi trash… um colar de perolas praticamente… =)

[]'s

everson_z

No método raca(); é esperado a classe pai mas retorno o filho!

Seria o mesmo que: B b = new A();

class Animal{  
    	   
    	   	Animal raca(){  
    		   	return null;
    	   	}  
    	}  
       
    	class Dog extends Animal{  
    	
    		Animal raca(){  
    			return new Dog();
    		
    		}  
    	}
everson_z

rs,
É que eu fiz assim

Covariante eu achava que era a classe aceitar o subtipo (filho)

O meu livro K&B deve ser diferente :twisted:

Criado 20 de dezembro de 2007
Ultima resposta 21 de dez. de 2007
Respostas 18
Participantes 8