Este escrito fue analizado por nuestros expertos así se asegura la veracidad de este tutorial.
Solución:
No es estrictamente una respuesta a su pregunta, pero ¿ha considerado usar un List
¿en cambio?
List
parece funcionar bien.
Consulte Teoría y práctica de Java: trampas genéricas para obtener una explicación detallada de por qué se desaconseja mezclar matrices con genéricos.
Actualizar:
Como mencionó Drew en los comentarios, podría ser incluso mejor usar la interfaz de Colección en lugar de List
. Esto puede ser útil si alguna vez necesita cambiar a un Set
o una de las otras subinterfaces de Collection
. Código de ejemplo:
Collection> maps = new HashSet>();
...
maps.add(new HashMap());
Desde este punto de partida, solo necesitaría cambiar HashSet
para ArrayList
, PriorityQueue
o cualquier otra clase que implemente Collection
.
No se puede crear con seguridad un genérico array. La segunda edición efectiva de Java entra en detalles en el capítulo sobre Genéricos. Comience en el último párrafo de la página 119:
¿Por qué es ilegal crear un genérico?
array? Porque no es typesafe. Si fuera legal, las conversiones generadas por el compilador en un programa correcto podrían fallar en tiempo de ejecución con un
ClassCastException
. Esto violaría la garantía fundamental proporcionada por el sistema de tipo genérico.Para hacer esto más concreto, considere el siguiente fragmento de código:
// Why generic array creation is illegal - won't compile! List
[] stringLists = new List [1]; // (1) List intList = Arrays.asList(42); // (2) Object[] objects = stringLists; // (3) objects[0] = intList; // (4) String s = stringLists[0].get(0); // (5) Supongamos que la línea 1, que crea un genérico array, es legal. La línea 2 crea e inicializa un
List
que contiene un solo elemento. La línea 3 almacena el
List
array en unaObject
array variable, lo cual es legal porque las matrices son covariantes. La línea 4 almacena elList
en el único elemento de laObject
arrayque tiene éxito porque los genéricos se implementan mediante borrado: el tipo de tiempo de ejecución de unList
instancia es simplementeList
y el tipo de tiempo de ejecución de un
List
instancia es[] List[]
por lo que esta asignación no genera un
ArrayStoreException
. Ahora estamos en problemas. hemos guardado unList
instancia en un array que se declara para celebrar sóloList
instancias. En la línea 5, recuperamos el elemento único de la lista única en este array. El compilador convierte automáticamente el elemento recuperado enString
pero es unInteger
por lo que obtenemos un
ClassCastException
en tiempo de ejecución. Para evitar que esto suceda, la línea 1 (que crea un genérico array) genera un error en tiempo de compilación.
Debido a que las matrices y los genéricos no se combinan bien (así como por otras razones), generalmente es mejor usar Collection
objetos (en particular List
objetos) en lugar de matrices.
En general no es buena idea mezclar genéricos y arreglos en Java, mejor usa un ArrayList.
Si debe utilizar un arrayla mejor manera de manejar esto es poner el array creación (su ejemplo 2 o 3) en un método separado y anótelo con @SuppressWarnings (“sin marcar”).