¿Qué es un tipo de retorno covariante en Java? ¿En la programación orientada a objetos en general?
java
oop
covariance
Pops
fuente
fuente
Respuestas:
Retorno covariante, significa que cuando uno anula un método, se permite que el tipo de retorno del método anulado sea un subtipo del tipo de retorno del método anulado.
Para aclarar esto con un ejemplo, un caso común es
Object.clone()
- que se declara para devolver un tipo deObject
. Puede anular esto en su propia clase de la siguiente manera:El beneficio aquí es que cualquier método que tenga una referencia explícita a un objeto MyFoo podrá invocar
clone()
y saber (sin conversión) que el valor de retorno es una instancia deMyFoo
. Sin tipos de devolución covariantes, el método anulado en MyFoo tendría que declararse para regresarObject
, por lo que el código de llamada tendría que rebajar explícitamente el resultado de la llamada al método (incluso aunque ambos lados "saben" que solo puede ser una instancia de MyFoo ).Tenga en cuenta que no hay nada especial
clone()
y que cualquier método anulado puede tener un retorno covariante; lo usé como ejemplo aquí, ya que es un método estándar donde a menudo es útil.fuente
List<Foo>
yList<FooBar>
?clone()
como aMethod<Void, Object>
, y preguntarse si el más específicoMethod<Void, MyFoo>
se puede asignar a ese tipo de padre. Lo cual es, si y solo si los métodos Java son covariantes en su tipo de retorno.Aquí hay otro ejemplo simple:
Animal
claseDog
claseEs posible modificar el tipo de retorno del método
Dog
'sseekFood()
aDogFood
una subclase deFood
, como se muestra a continuación:Eso es perfectamente legal un primordial, y el tipo de retorno de
Dog
'sseekFood()
método se conoce como tipo de retorno covariantes .fuente
Desde el lanzamiento de JDK 1.5, se introdujeron los tipos covariantes en Java. y te lo explicaré con un caso simple: cuando anulamos una función, la función puede realizar cambios en su comportamiento, eso es lo que puedes leer en la mayoría de los libros, pero lo que los {autores} se pierden es que también podemos cambiar el tipo de retorno. Consulte el enlace a continuación para obtener una aclaración, podemos cambiar el tipo de devolución siempre que se pueda asignar al tipo de devolución de la versión base del método.
Entonces, esta característica de devolver tipos derivados se llama COVARIANT ...
¿Pueden los métodos anulados diferir en el tipo de retorno?
fuente
Los tipos de retorno covariantes simplemente significan devolver la propia referencia de clase o su referencia de clase secundaria.
fuente
Parent.foo()
devuelve un tipo no relacionadoA
yChild.foo()
devuelve un tipoB
derivado deA
.Para agregar a las respuestas anteriores, es posible anular entre los tipos de retorno covariantes, con la restricción de que el tipo de retorno del método de anulación (método de subclase) debe ser una subclase del tipo de retorno del método anulado (método de superclase). Esto es válido desde Java 5 en adelante.
fuente
El tipo de retorno covariante especifica que el tipo de retorno puede variar en la misma dirección que la subclase
Antes de Java 5, no era posible anular ningún método cambiando el tipo de retorno. Pero ahora, desde Java5,
es posible anular el método cambiando el tipo de retorno si la subclase anula cualquier método cuyo tipo de retorno sea No primitivo pero cambia su tipo de retorno a tipo de subclase.
fuente
Tenemos la libertad de tener tipos de retorno más específicos al anular
métodos.
Ayuda para prevenir ClassCastExceptions en tiempo de ejecución en devoluciones
referencia: www.geeksforgeeks.org
fuente
UnaryOperator.java
Function.java
fuente
Antes de Java5, no era posible anular ningún método cambiando el tipo de retorno. Pero ahora, desde Java5, es posible anular el método cambiando el tipo de retorno si la subclase anula cualquier método cuyo tipo de retorno sea No primitivo pero cambia su tipo de retorno al tipo de subclase.
fuente