2010-10-05 9 views
21

No entiendo el error de la creación de matriz genérica.
Primero probé el siguiente:
Error: creación de matriz genérica

public PCB[] getAll() { 
     PCB[] res = new PCB[list.size()]; 
      for (int i = 0; i < res.length; i++) { 
       res[i] = list.get(i); 
      } 
     list.clear(); 
     return res; 
} 


Luego he intentado hacer esto:

PCB[] res = new PCB[100]; 


Debo estar perdiendo algo causa que parece derecho. Intenté buscarlo, realmente lo hice. Y nada está haciendo clic.


Mi pregunta es: ¿Qué puedo hacer para solucionar esto?


el error es:

.\Queue.java:26: generic array creation 
PCB[] res = new PCB[200]; 
      ^
Note: U:\Senior Year\CS451- file  
uses unchecked or unsafe operations. 
Note: Recompile with -Xlint:unchecked for details. 
1 error 

herramienta completa con código de salida 1

+0

Puede publicar la Excepción/Error –

+1

Supongo que 'PCB' es un parámetro de tipo genérico y, por lo tanto, lo que está haciendo es imposible en Java debido al borrado de tipo. Si eso es cierto, debe hacer clic en el enlace Marqué esto como un duplicado, ya que proporciona una solución alternativa. –

+0

ya intenté leer esa publicación. no me ayuda – Luron

Respuesta

29

No se pueden crear matrices con un tipo de componente genérico.

Cree una matriz de un tipo explícito, como Object[], en su lugar. Puede enviar esto al PCB[] si lo desea, pero no lo recomiendo en la mayoría de los casos.

PCB[] res = (PCB[]) new Object[list.size()]; /* Not type-safe. */ 

Si desea la seguridad de tipos, utilice una colección como java.util.List<PCB> lugar de una matriz.

Por cierto, si list ya es un java.util.List, debe utilizar uno de sus métodos toArray(), en lugar de duplicarlos en su código. Sin embargo, esto no soluciona el problema de la seguridad del tipo.

+2

sí, pero cuando lo devuelve al exterior, y la persona que llama lo asigna a una variable de tipo PCB []. boom obtendrá una excepción de lanzamiento de clase – newacct

+0

@newacct - Eso no necesariamente sucederá. Depende del contexto de la llamada. Pero puede suceder. Eso es lo que quise decir con "No seguro para tipos", y por qué lo recomendé. – erickson

+1

@erickson: Eventualmente sucederá en algún momento mientras se desarrolla la recursión. Los genéricos siempre se vuelven concretos en algún momento o de lo contrario nunca se haría ningún trabajo. La única forma en que esto funcionaría razonablemente es si el resultado nunca se usa realmente como una matriz del tipo real de 'PCB'. En cuyo caso, es mucho mejor declararse como un 'Objeto []'. –

2

Además de la manera sugerida en el "posible duplicado", la otra forma principal de evitar este problema es que la matriz proporcione la matriz (o al menos una plantilla de uno), que con suerte conocerá el tipo concreto y por lo tanto puede crear la matriz de forma segura.

De esta forma se implementan métodos como ArrayList.toArray(T[]). Te sugiero que eches un vistazo a ese método de inspiración. Mejor aún, probablemente deberías estar usando ese método de todos modos, como otros han notado.

2

Lo siguiente le dará una variedad del tipo que desee mientras se preserva la seguridad del tipo.

PCB[] getAll(Class<PCB[]> arrayType) { 
    PCB[] res = arrayType.cast(java.lang.reflect.Array.newInstance(arrayType.getComponentType(), list.size())); 
    for (int i = 0; i < res.length; i++) { 
     res[i] = list.get(i); 
    } 
    list.clear(); 
    return res; 
} 

¿Cómo funciona esto se explica en profundidad en my answer a la pregunta que Kirk Woll vinculado como un duplicado.

Cuestiones relacionadas