2011-02-27 18 views
35

¿Alguien puede explicarme por qué no puedo convertir List<> en ArrayList<> con primer enfoque y lo hago con el segundo? Gracias.Cómo lanzar ArrayList <> de la lista <>

Primera aproximación:

ArrayList<Task> tmp = ((ArrayList<Task>)mTrackytAdapter.getAllTasks(token)); 

Segundo enfoque:

ArrayList<Task> tmp = new ArrayList<Task>(mTrackytAdapter.getAllTasks(token)); 

Respuesta

23

Al hacer el segundo, estás haciendo una nueva ArrayList, no estás tratando de fingir la otra lista es un arraylist

Quiero decir, ¿y si la lista original se implementa como una lista de enlaces, o alguna lista personalizada? No lo sabrás El segundo enfoque es preferido si realmente necesita hacer un arraylist del resultado. Pero puedes dejarlo como una lista, ¡esa es una de las mejores ventajas del uso de interfaces!

1

El primer enfoque es intentar lanzar la lista, pero esto solo funcionaría si el List<> fuera un ArrayList<>. Ese no es el caso. Por lo que necesita el segundo enfoque, que es la construcción de un nuevo ArrayList<> con los elementos de la List<>

5

El segundo enfoque es claramente erróneo si quieres lanzar. Instancia una nueva ArrayList.

Sin embargo, el primer enfoque debería funcionar bien, solo si getAllTasks devuelve una ArrayList.

¿Realmente es necesario que tenga una ArrayList? ¿No es suficiente la interfaz de la Lista? Lo que está haciendo puede conducir a la excepción de tiempo de ejecución si el tipo no es correcto.

Si getAllTasks() devuelve una ArrayList, debe cambiar el tipo de devolución en la definición de la clase y, luego, no necesitará un molde y si le devuelve algo más, no podrá convertirlo a ArrayList.

10

Cuando está utilizando el segundo enfoque, está inicializando el arraylist con sus valores predefinidos. Como generalmente hacemos ArrayList listofStrings = new ArrayList <>(); Digamos que tiene una matriz con valores, ahora quiere convertir esta matriz en una lista de arrays.

primero necesita obtener la lista de la matriz utilizando Arrays utils. Porque ArrayList es un tipo concreto que implementa la interfaz de lista. No se garantiza que el método asList regrese a este tipo de implementación.

List<String> listofOptions = (List<String>) Arrays.asList(options); 

luego puede crear el usuario de una lista de arrays para crear instancias con valores predefinidos.

ArrayList<String> arrlistofOptions = new ArrayList<String>(list); 

Así que su segundo enfoque está trabajando que ha pasado los valores que intantiate ArrayList con los elementos de la lista.

Más sobre

ArrayList que se devuelve desde matrices.asList no es una lista de arrays real, es solo un contenedor que no permite ninguna modificación en la lista. Si intenta añadir o eliminar más Arrays.asList que le dará

UnsupportedOperationException

2

Puedes lanzar Lista <> a ArrayList <> si se entiende lo que estás haciendo. El compilador de Java no lo bloqueará.

Pero:

  1. Es mala práctica de fundición de tipo padre a hijo tipo (o interfaz con el tipo de aplicación) sin comprobar. Este mejor manera:

if (list instanceof ArrayList<Task>) { ArrayList<Task> arraylist = (ArrayList<Task>) list; }

  1. Tal vez usted no necesita tipo de implementación como referencia. Mira la advertencia de SonarQube https://sbforge.org/sonar/rules/show/squid:S1319. Puede evitar este casting en la mayoría de los casos.
  2. Puede utilizar el método de guayaba: ArrayList<Task> arraylist = Lists.newArrayList(list);
4

Intenta esto:

ArrayList<SomeClass> arrayList; 

public SomeConstructor(List<SomeClass> listData) { 
     arrayList.addAll(listData); 
} 
Cuestiones relacionadas