into - ¿Por qué la Colección de Java<E>.toArray() devuelve un Objeto[] en lugar de una E[]?
pass arraylist to array (3)
@Lukas, con respecto a: “nueva E []”
La nueva E [0] generó el error del comiler, como probablemente esperaba. La solución que he encontrado es:
final E [] returnArray = (E []) events.toArray (new Event [events.size ()]);
NB: el código está en una clase de plantilla Escucha <E extiende Evento>.
En mi solución, el borrado de tipo es tanto el problema como la solución. La conversión a (E []) es segura porque su tipo preciso se borra en Evento []. El único inconveniente que veo es la advertencia del compilador sobre "operaciones no comprobadas o inseguras" (que, obviamente, la conversión no es, en este caso, un borrado de tipo dado).
@Lukas, sobre compatibilidad hacia atrás.
No veo un gran problema con la compatibilidad con versiones anteriores. Hacer que el tipo de retorno sea más especial no es lo mismo que hacer que el tipo de argumento sea más especial.
En otras palabras, el código fuente que hasta ahora esperaba que Collection.toArray () devuelva un Objeto [] debería estar perfectamente feliz de recibir una E [] en su lugar.
Y en cuanto al código de bytes, el Objeto [] y E [] son de todos modos los mismos debido al borrado de tipo.
Antes de los genéricos de Java, Collection.toArray()
no tenía forma de saber qué tipo de arreglo esperaba el desarrollador (particularmente para una colección vacía). Como lo entiendo, esta fue la razón principal detrás de la collection.toArray(new E[0])
expresiones idiomáticas. Array collection.toArray(new E[0])
.
Con los genéricos, la Collection<E>.toArray()
solo puede devolver una matriz llena de instancias de E
y / o sus especializaciones. Me pregunto por qué el tipo de retorno todavía es como Object[]
lugar de E[]
. En mi opinión, devolver una E[]
lugar de un Object[]
no debería romper el código existente.
Consulte: Collection.toArray()
, Collection.toArray(T[])
y el tema relacionado java: (String []) List.toArray () da ClassCastException
El "borrado de tipo" es solo una explicación parcial: ni la Collection
ni su método toArray()
tienen información sobre E
en el tiempo de ejecución.
También es debido a la compatibilidad con versiones anteriores, que Collection.toArray()
aún debe devolver Object[]
. Antes de Java 1.5, no había forma de conocer un tipo genérico para una colección, por lo que este era el único diseño de API razonable.
Es una muy buena pregunta. La respuesta es que los genéricos también se llaman "borrados". No es solo un nombre. La información codificada por genéricos se usa solo en tiempo de compilación y luego se elimina. Por lo tanto, JVM ni siquiera conoce este tipo genérico E
, por lo que no puede crear la matriz E[]
.
Otro método toArray(T[] a)
recibe la información sobre el tipo del argumento en tiempo de ejecución. Esta es la razón por la que el prototipo de este método es <T> T[] toArray(T[] a)
: obtiene una matriz de tipo T y puede devolver una matriz de tipo T. El tipo se pasa como parámetro.