Dúvida questão

olá …

reparem: este código roda sem problemas


public class Animal {
	
	Animal debug() {
		return this;
	}

} 

class Horse extends Animal {
	Horse debug() {
		return this;
	}
}

Agora se, mudarmos para:

public class Animal {
	
	Animal debug() {
		return this;
	}

} 

class Horse extends Animal {
	Object debug() {
		return this;
	}
}

dá erro de compilação

por que? Horse É-UM Object

Horse não é um Object e sim Animal , nem todo Object é Horse


public class Animal extends Object
{}

public class Horse extends Animal
{}

Implicitamente toda classe em Java herda de Object(mas neste caso deixei explicito que classe Animal herda de Object) essa característica se deve fato do Java respeitar herança

Exatamente, você não pode fazer isso porque a classe filha estaria autorizada a retornar um object que não fosse um Horse.

Considere o exemplo:

Animal horse = new Horse(); Animal aHorse = xyz.debug();

Veja, se o método debug de horse pudesse ser um object qualquer (digamos um Carro, que não é um animal), isso não violaria o uso com polimorfismo acima?

Agora, retornar um filho de animal (um Horse), não é problema nenhum. A chamada acima ainda fica garantida, pois Horse é um animal.

Isso ae… a questao nao eh se “horse eh um animal” neste ponto vc tem razao… a questao eh se Object eh um Animal e aih esta um erro

o metodo debug de horse eh um override do metodo debug de animal, ainda q seus retornos sejam diferentes…

Gente, agora que entendi o problema… foi mal ai

o problema é que debug() foi subscrita na subclasse Horse, então uma das regras da Subscrição é que o tipo de retorno do método subscrito deve ser o mesmo tipo ou covariante (um subtipo). Como Object não é subtipo de Animal, erro de compilação!

Basta mudar o nome do método subscrito que veremos que não tem nada a ver.

   public class Animal {  
          
        Animal debug() {  
            return this;  
        }  
      
    }   
      
    class Horse extends Animal {  
       Object debug1() {  
           return this;  
       }  
   }  

Como não existe mais subscrita, podemos retornar Object bonitinho sem erro de compilação :lol: :lol:
obrigado.

Horse É-UM Object sim…

uma exemplo mais claro… e no mundo real… todo cachorro(independente da raça) É-UM Animal… porem nem todo ANIMAL É-UM cachorro…
Consegue perceber isso no seu programa?

flw! espero ter ajudado :smiley:

[quote=LPJava]uma exemplo mais claro… e no mundo real… todo cachorro(independente da raça) É-UM Animal… porem nem todo ANIMAL É-UM cachorro…
Consegue perceber isso no seu programa?

flw! espero ter ajudado :D[/quote]

sim sim… está mais do que claro… o problema foi uma violação nas regras de subscrição…

Horse é um Object sim (todas as classes estendem Object, logo todo mundo É-UM Object).
A questão é que Object NÃO é um Horse. Aí que está o problema…

[quote=Adolfo Rodrigues]Horse é um Object sim (todas as classes estendem Object, logo todo mundo É-UM Object).
A questão é que Object NÃO é um Horse. Aí que está o problema…[/quote]

O problema não está aí… o problema está como foi explicado aqui:

[]'s

[quote=RafaelVS][quote=Adolfo Rodrigues]Horse é um Object sim (todas as classes estendem Object, logo todo mundo É-UM Object).
A questão é que Object NÃO é um Horse. Aí que está o problema…[/quote]

O problema não está aí… o problema está como foi explicado aqui:

[]'s[/quote]

com todo o respeito… mas até que enfim alguém entendeu… :wink:

[quote=Adolfo Rodrigues]
A questão é que Object NÃO é um Horse. Aí que está o problema…[/quote]

[]'s[/quote]

Quando eu disse que Horse é um Object mas Object não é um Horse eu disse exatamente que “Object não é subtipo de Animal”. Vocês não entenderam ou não foi realmente isto que eu escrevi?

[quote=Adolfo Rodrigues][quote=Adolfo Rodrigues]
A questão é que Object NÃO é um Horse. Aí que está o problema…[/quote]

[]'s

Quando eu disse que Horse é um Object mas Object não é um Horse eu disse exatamente que “Object não é subtipo de Animal”. Vocês não entenderam ou não foi realmente isto que eu escrevi?[/quote]

cara… mais uma vez… essa questão de um ser subtipo do outro não é a fonte do problema sacou… o seu texto não está errado, apenas não é o real motivo do problema. Se o metodo debug() não fosse subscrito pela classe horse, poderíamos retornar um Object() bonitinho mesmo Object não sendo subtipo de Horse ou de Animal… o problema é uma violação de regras da subscrita…

ta bom. .esse assunto já tá mais que passado e discutido e todo mundo está certo. :lol: :lol: …

caduengenheiro,

Você está correto sim. Eu que achei que estivesse claro pra todo mundo que a questão maior era a sobrescrita incorreta do método debug. E por que estava incorreta? Porque Object não é um Animal (nem tampouco um Horse). Neste sentido, acredito que era esta sim (mais especificamente) a fonte do problema.
Mas isto já tinha sido respondido antes do meu primeiro post. Resolvi escrever somente porque vejo que muita gente se engana pensando que quando “B” estende “A”, “A” é um “B”, quando a única verdade é que “B” é um “A” (e ambos são um Object). Achei importante enfatizar que “Horse é Object mas Object não é Horse (nem Animal)”. Talvez isso pudesse ajudar alguém que tende a entender esta questão de forma incorreta. Foi só isso :smiley:
Desculpem-me se não me fiz entender.

[]s