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?
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?
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.
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.
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?
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
public inteface Animal{
Animal comer();
}
class Dog implements Animal{
public Dog comer(){
new Dog();
}
}
Acha que isso é um retorno cavariante ???
melhor dizendo acha que isso é uma subscrição válida ?
como assim amigo… isso daria erro não ? Supondo de A é superCLasse e B e SubClasse ?
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…
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?
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>
Eu tbm acho anderson !!!
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!
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.
}
}
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();
}
}
NeoHacker você tem razão, não sei por que o Camilo coloco tipo primitivos ai… não entendi Camilo !
Nossa pessoal… vamos nos limitar as questões as quais temos pleno conhecimento?
Esse tópico foi trash… um colar de perolas praticamente… =)
[]'s
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();
}
}
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: