convertir array java list arraylist incomplete-type

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 de G<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>> .