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 5 días 8 horas
hace 5 días 8 horas
hace 5 días 9 horas
hace 25 semanas 1 día
hace 26 semanas 3 días
hace 33 semanas 1 día
hace 1 año 25 semanas
hace 2 años 37 semanas
hace 2 años 41 semanas
hace 2 años 49 semanas