En los sistemas de tipado estático, existe este concepto de varianza, que a veces puede entenderse muy fácil pero tampoco es tan intuitivo como parece.
Para ilustrar la varianza, vamos a definir una jerarquía de clases muy simple:
public class A {}
public class B extends A {}
public class C extends B {}
Y definimos un método o función que usa estos tipos:
public B f(B param) {
//Qué puede devolver?
}
Primero que nada, viéndolo desde fuera, ¿A qué tipo de variables podemos asignar lo que devuelve esta función?
B algo;
A a = f(algo);
B b = f(algo);
C c = f(algo);
Las primeras dos líneas son correctas, la tercera da un error. Esto es porque la función devuelve un valor de tipo B, y B es también un A. Pero no podemos asignar a una subclase de B, al menos no sin hacer un cast, pero no vamos a hacer casts en esta ocasión. B no es un C, por lo tanto la tercera línea no compila.
Hasta aquí todo bien. Ahora, ¿Qué le podemos pasar como argumento a esta función? Tiene un solo parámetro de tipo B. En esta ocasión, es alrevés:
f(new A()); //ERROR
f(new B()); //OK
f(new C()); //OK
Comentarios recientes
hace 1 semana 6 días
hace 6 semanas 6 horas
hace 13 semanas 3 días
hace 21 semanas 4 días
hace 24 semanas 1 día
hace 25 semanas 5 días
hace 29 semanas 2 horas
hace 29 semanas 2 horas
hace 35 semanas 1 hora
hace 36 semanas 23 horas