Me encontré con algo muy básico pero extremadamente desconcertante hoy. Necesitaba convertir una lista en una matriz. La lista contenía String
instancias. Ejemplo perfecto de usar List.toArray(T[])
, ya que quería una instancia de String[]
. No funcionaría, sin embargo, sin emitir explícitamente el resultado a String[]
.Comportamiento genérico extraño de List.toArray (T [])
Como escenario de prueba, he utilizado el siguiente código:
import java.util.Arrays;
import java.util.List;
public class MainClass {
public static void main(String args[]) {
List l = Arrays.asList("a", "b", "c");
String stuff[] = l.toArray(new String[0]);
System.err.println(Arrays.asList(stuff));
}
}
que no compila. Es casi una copia exacta del ejemplo en el javadoc, sin embargo, el compilador dice lo siguiente:
MainClass.java:7: incompatible types
found : java.lang.Object[]
required: java.lang.String[]
String stuff[] = l.toArray(new String[0]);
^
Si añado un yeso para String[]
va a compilar y ejecutar a la perfección. Pero eso no es lo que cabe esperar cuando miraba a la firma del método toArray:
<T> T[] toArray(T[] a)
Esto me dice que yo no debería tener que emitir. Que esta pasando?
Editar:
Curiosamente, si cambio de la declaración a la lista:
List<?> l = Arrays.asList("a", "b", "c");
también funciona. O List<Object>
. Por lo tanto, no tiene que ser un List<String>
como se sugirió. Estoy comenzando a pensar que usar el tipo List
sin procesar también cambia la forma en que funcionan los métodos genéricos dentro de esa clase.
Segunda edición:
Creo que ahora lo entiendo. Lo que Tom Hawtin escribió en un comentario a continuación parece ser la mejor explicación. Si usa un tipo genérico de forma cruda, el compilador borrará toda la información genérica de esa instancia.
Esto tiene sentido para mí lógicamente, pero no técnicamente. No me parece que al método toArray le importe a lo que E está vinculado (es decir, la clase de elementos de la lista). – waxwing
la firma de toArray es "public T [] toArray (T [] a)", T es el tipo de componente de la matriz pasada en –
dfa
Tampoco puedo entenderlo, peor es que también funciona usando una lista