java - convertir - Tipos incompatibles Lista de Lista y Lista de Array de Lista de Array
list to array java (6)
La siguiente línea me da error:
Incompatible Types.
List<List<Integer>> output = new ArrayList<ArrayList<Integer>>();
¿Cual es la razon?
EDITAR
Entiendo que si cambio mi segunda ArrayList a Lista, no me da error. Aunque quiero saber la razón del error. Gracias
De los genéricos, la herencia y los subtipos
Este es un malentendido común cuando se trata de programar con genéricos, pero es un concepto importante para aprender.
Box<Integer>
no es un subtipo de Box aunque Integer es un subtipo de Number.
Está claramente establecido en Java Doc.
En general, si Foo es un subtipo (subclase o subinterfaz) de Bar, y G es una declaración de tipo genérico, no es el caso que
G<Foo>
sea un subtipo deG<Bar>
. Esta es probablemente la cosa más difícil que necesita aprender acerca de los genéricos, porque va en contra de nuestras intuiciones profundamente arraigadas.
Lo mismo sucede aquí: Bar = List<Integer>
y Foo = ArrayList<Integer>
como ArrayList<ArrayList<Integer>>
no es un subtipo de List<List<Integer>>
La escritura correcta debe ser: List<List<Integer>> ret = new ArrayList<List<Integer>>();
De esta manera, puede agregar no solo ArrayList
sino también LinkedList
para ret
La razón es que los genéricos no son covariant .
Considere el caso más simple:
List<Integer> integers = new ArrayList<Integer>();
List<Number> numbers = integers; // cannot do this
numbers.add(new Float(1337.44));
Ahora Lista tiene un Flotador, que es ciertamente malo.
Lo mismo para tu caso.
List<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>();
List<List<Integer>> ll = al; // cannot do this
ll.add(new LinkedList<Integer>())
Ahora tiene una lista ll
que contiene LinkedList
, pero el al
se declara como una lista de ArrayList
s.
Menos texto más correcciones:
List<List<Integer>> lists = new ArrayList<>();
o
List<List<Integer>> lists = new ArrayList<List<Integer>>();
Si tuviera una List<List<Integer>>
entonces podría agregarle una LinkedList<Integer>
. Pero no puede hacer esto para una ArrayList<ArrayList<Integer>>
, por lo que este último no puede ser un tipo de List<List<Integer>>
.