O que é um tipo de retorno covariante em Java? Em programação orientada a objetos em geral?
java
oop
covariance
Pops
fonte
fonte
Respostas:
Retorno covariante, significa que quando alguém sobrescreve um método, o tipo de retorno do método sobrescrita pode ser um subtipo do tipo de retorno do método sobrescrito.
Para esclarecer isso com um exemplo, um caso comum é
Object.clone()
- que é declarado para retornar um tipo deObject
. Você pode substituir isso em sua própria classe da seguinte maneira:O benefício aqui é que qualquer método que contenha uma referência explícita a um objeto MyFoo será capaz de invocar
clone()
e saber (sem lançar) que o valor de retorno é uma instância deMyFoo
. Sem os tipos de retorno covariante, o método sobrescrito em MyFoo teria que ser declarado para retornarObject
- e então o código de chamada teria que reduzir explicitamente o resultado da chamada do método (mesmo que ambos os lados "saibam" que só pode ser uma instância de MyFoo )Observe que não há nada de especial
clone()
e que qualquer método substituído pode ter um retorno covariante - usei-o como um exemplo aqui, pois é um método padrão onde geralmente é útil.fonte
List<Foo>
eList<FooBar>
?clone()
como sendo umMethod<Void, Object>
e perguntar se o mais específico podeMethod<Void, MyFoo>
ser atribuído a esse tipo de pai. O que é, se e somente se os métodos Java são covariantes em seu tipo de retorno.Aqui está outro exemplo simples:
Animal
classeDog
classeÉ possível modificar o tipo de retorno do
Dog
'sseekFood()
método paraDogFood
- uma subclasse deFood
, como mostrado abaixo:Isso é perfeitamente um primordial legal, e o tipo de retorno
Dog
doseekFood()
método é conhecido como tipo de retorno covariant .fonte
A partir do lançamento do JDK 1.5, os tipos covariant foram introduzidos em Java. e vou explicar para você com um caso simples: Quando substituímos uma função, a função tem permissão para fazer alterações em seu comportamento isso é o que você lê na maioria dos livros, mas o que eles {autores} perdem é que podemos alterar o tipo de retorno também. verifique o link abaixo para esclarecimento, podemos alterar o tipo de retorno, desde que possa ser atribuído ao tipo de retorno da versão Base do método.
Portanto, esse recurso de retornar tipos derivados é chamado de COVARIANTE ...
Os métodos substituídos podem diferir no tipo de retorno?
fonte
Os tipos de retorno covariant simplesmente significam retornar a própria referência de classe ou sua referência de classe filha.
fonte
Parent.foo()
retorna um tipo não relacionadoA
eChild.foo()
retorna um tipoB
derivado deA
.Para adicionar às respostas acima, a substituição é possível entre os tipos de retorno co-variantes, com a restrição de que o tipo de retorno do método de substituição (método da subclasse) deve ser uma subclasse do tipo de retorno do método substituído (método da superclasse). Isso é válido do Java 5 em diante.
fonte
O tipo de retorno covariante especifica que o tipo de retorno pode variar na mesma direção da subclasse
Antes do Java 5, não era possível substituir nenhum método alterando o tipo de retorno. Mas agora, desde Java5,
é possível sobrescrever o método alterando o tipo de retorno se a subclasse sobrescrever qualquer método cujo tipo de retorno seja Não-Primitivo, mas ele altera seu tipo de retorno para o tipo de subclasse.
fonte
Temos a liberdade de ter tipos de retorno mais específicos ao substituir
métodos.
Ajuda na prevenção de ClassCastExceptions em tempo de execução em devoluções
referência: www.geeksforgeeks.org
fonte
UnaryOperator.java
Function.java
fonte
Antes do Java5, não era possível substituir nenhum método alterando o tipo de retorno. Mas agora, desde o Java5, é possível sobrescrever o método alterando o tipo de retorno se a subclasse sobrescrever qualquer método cujo tipo de retorno seja Não-Primitivo, mas altere seu tipo de retorno para o tipo de subclasse.
fonte