¿Por qué List .toArray () devuelve Object y no String ? cómo solucionar esto?

¿Alguien sabe por qué Java 1.6 tiene este comportamiento?

List list = ArrayList(); String[] arr = (String[]) list.toArray(); 

Y obtengo una ClassCastException, porque devuelve Object [] y no String [].

Pensé que List.toArray() debería devolver T [] – no? ¿Alguien tiene una respuesta por qué este inconveniente existe en el idioma? ¿Y también cómo solucionar esto? ¿Cómo obtengo un String [] de List sin bucles a través de los elementos?

Necesita pasar una matriz para que su tipo de tiempo de ejecución se pueda utilizar como una pista por toArray . Pruebe toArray(new String[0]) lugar. También puede pasar en una matriz pre-dimensionada.

Para entender, considere qué tipo de borrado tendría que hacer para hacer

 new T[4] 

trabajo. Si Java lo permitió, lo mejor que podría hacer después de la eliminación es

 new Object[4] 

La mayoría de toArray implementaciones de toArray usan java.lang.reflect.Array para construir una matriz de salida del tipo correcto dada una sugerencia de tipo pasada como Class .

Debido a que los arreglos han estado en Java desde el principio, mientras que los generics solo se introdujeron en Java 5. Y el método List.toArray() se introdujo en Java 1.2, antes de que existieran los generics, por lo que se especificó para devolver Object[] . Muchos códigos existentes ahora esperan que List.toArray() devuelva Object[] , por lo que no se puede cambiar ahora.

Además, los generics se borran en tiempo de ejecución, por lo que ArrayList no podría incluso construir una matriz del tipo correcto si así lo deseara.

La laguna para esto es el List.toArray(T[]) , que le devolverá una matriz del tipo correcto, siempre que le proporcione una matriz del tipo correcto para que sepa qué tipo usar.

Para entender por qué sucede eso, solo eche un vistazo al javadoc de Collection.toArray() y luego mire el método Collection.toArray(T[] a) . También tenga en cuenta que los generics en Java se borran en el tiempo de ejecución.

Las razones son dos:

  1. El método precedió a Generics y no pudieron cambiar la firma sin romper la compatibilidad hacia atrás.

  2. En cualquier caso, como la List se construye sin una Class no hay forma de que la implementación construya una matriz de tipo T

La solución alternativa será usar:

  List list = new ArrayList<>(); list.add("Sputnik"); list.add("Explorer"); //String[] str = list.toArray(); 

Esto está obligado a arrojar un: tipos incompatibles: Objeto [] no se puede convertir a String [] error

  Instead use: String[] str = list.toArray(new String[0]); or String[] str = list.toArray(new String[list.size()]);