Duvida sobre: sobrescrição e os tipos de retorno e retornos covariantes

8 respostas
O

Galera eu estou com uma duvida aqui em relação a retornos Covariantes tem um exemplo aqui do livro da Kathy Sierra e Bert Bates

Nesse livro tem esse exemplo:
A sobrescrição e os tipos de retorno e retornos covariantes

Vejamos um retorno covariante em ação:

public class Foo{
	 
    public void go(){}

}
public class Bar extends Foo{

    
    public String go(){
    	
    	return null;
    }
    
    
    
}

Ai vem com o java 5, esse código compilará sem problemas.

Só que quando eu compilo eu recebo este erro:go() in Bar cannot override go() in Foo; attempting to use incompatible return type
found : java.lang.String
required: void
public String go(){
^
1 error

Lembrando que eu já estou usando o java 6.

Desde de já eu agradeço pela atenção e pela paciência.

8 Respostas

Diabo_Loiro

cara retorno covariante eh retornar uma subclasse do tipo e voce esta mudando o tipo de retorno por isso o erro

por exemplo

class bola{
public Object tamanho(){
return new Object();
}
}

class bolinha extends bola{
public Integer tamanho(){
return new Integer();
}
}
isso seria um retorno covariante por que Integer eh subclasse de object
M

Qual a diferença então de sobreescrita e retorno covariantes?
Sendo que, o exemplo do nosso amigo parece uma sobreescrita, Mas parece invalida pq o compilador nao aceita, Qual a explicação???

Diabo_Loiro

no meu exemplo voce esta sobrescrevendo usando retornos covariantes…

o dele nao compila pois voce nao pode sobrescrever um metodo que tem tipo de retorno diferentes isso quebra as regras e o compilador reclama no exemplo dele ele tenta sobrescrever um metodo VOID ou seja que nao tem retorno por um que do tipo STRING que retorna uma string com isso falha a compilação

O

Então esse e o exemplo que o livro me deu.

taaqui

http://www.guj.com.br/posts/list/124196.java

M
class Foo {

    public Foo() {
    }


  String go(){
      return "";
    }
}

 class Bar extends Foo{


     int go(int a){
     return 2;}
 }

Qual a diferença desse então ( compila perfeitamente), que é sobreescreve o metodo da superclasse com sucesso???

pra esse:

class Foo {

    public Foo() {
    }


  String go(){
      return "";
    }
}

 class Bar extends Foo{


     int go(){
     return 2;}
 }

Que sobrescreve o codigo da superclasse mas nao bota nenhum parametro, e o compilador não aceita. Pq ?
Pq preciso mudar o parâmetro para se tornar válido?

Diabo_Loiro

cara no primeiro exemplo voce esta SOBRECARREGANDO e nao SOBRESCREVENDO o metodo porque voce muda lista de parametros

no segundo caso nao compila pois voce esta tentando sobrescrever com tipo diferentes no caso String e int

espero que agora tenha entendido

O

Muito Obrigado duvida sanada.

Criado 29 de junho de 2009
Ultima resposta 29 de jun. de 2009
Respostas 8
Participantes 4