public void wahey(List<Object> list) {}
wahey(new LinkedList<Number>());
La llamada al método no se verificará. Ni siquiera puedo emitir el parámetro como sigue:¿Por qué la Lista <Number> no es un subtipo de la Lista <Object>?
wahey((List<Object>) new LinkedList<Number>());
De mi investigación, he deducido que la razón para no permitir este tipo es la seguridad. Si se nos permitió hacer lo anterior, entonces podríamos tener lo siguiente:
List<Double> ld;
wahey(ld);
Dentro de la wahey método, podríamos añadir algunas cadenas a la lista de entrada (como el parámetro mantiene una referencia List<Object>
). Ahora, después de la llamada al método, ld se refiere a una lista con un tipo List<Double>
, ¡pero la lista actual contiene algunos objetos String!
Esto parece diferente a la forma normal en que Java funciona sin genéricos. Por ejemplo:
Object o;
Double d;
String s;
o = s;
d = (Double) o;
Lo que estamos haciendo aquí es esencialmente el mismo, excepto que esto pasará controles de tiempo de compilación y sólo un error en tiempo de ejecución. La versión con Listas no se compilará.
Esto me lleva a creer que esto es puramente una decisión de diseño con respecto a las restricciones de tipo en los genéricos. Esperaba obtener algunos comentarios sobre esta decisión?
relacionado (no es un duplicado exacto, aunque la respuesta correcta es básicamente la misma): http: // stackoverflow.com/questions/251298/why-is-someclass-super-t-not-equivalent-to-someclasst-in-java-generic-types – Kip
El término artístico es ** covarianza ** - Menciono esto porque hace es más fácil buscarlo, incluso en Desbordamiento de pila (si desea ver lo que dije al respecto, en el contexto de C#, pero también se aplica a Java) busque [usuario de covarianza: 95810], por ejemplo). –
Un molde doble como 'wahey ((Lista