2009-12-03 6 views
21

de código queAdvertencia Java utilizando vectores: Llamada sin marcar para añadir (E) poco

Vector moves = new Vector(); 

moves.add(new Integer(x)); 

error:

ConnectFour.java:82: warning: [unchecked] unchecked call to add(E) as a member of the raw type java.util.Vector moves.add(new Integer(x)); 

En realidad, no está seguro de cuánto información que se necesita para un error como este .. ..

+6

Tenga en cuenta que no es un error, solo una advertencia. Todavía es perfectamente válido hacer lo anterior, si no le importa la advertencia. – Joel

Respuesta

28

El problema es que el código anterior no utiliza generics.

El siguiente trabajo:

Vector<Integer> moves = new Vector<Integer>(); 

move.add(new Integer(x)); 

El nombre del tipo en el interior del <> (en el caso de Vector, el parámetro de tipo E para el elemento para sostener) indica al compilador qué tipo de objeto que debe esperar.

Si se intenta agregar un objeto que es del tipo especificado, como en este caso, tratando de agregar un String a Vector<Integer>, se producirá un error en tiempo de compilación, indicando que un tipo de objeto que no es del tipo esperado se está agregando.

Dicho esto, uno debe tratar de no utilizar la clase Vector. Para más propósitos, una clase implementando List como ArrayList del Java Collections Framework sería suficiente y de mejor rendimiento.

Editar

Aunque no está directamente relacionada con la pregunta acerca de los genéricos, Adam Paynter trajo un buen punto en los comentarios sobre el uso de auto-boxing.

Desde Java 5, las primitivas y sus clases de envoltura, p. int y Integer se convertirán automáticamente entre sí según sea necesario.

Por lo tanto, es posible añadir un valor especificado como un intint o un literal en una clase esperando una Integer:

Vector<Integer> v = new Vector<Integer>(); 
v.add(5); // Not necessary to use an Integer value. 
+1

+1. Además, parece que están compilando para Java 5 o superior. Debido a esto, también podrían aprovechar el auto-boxing: 'move.add (x);' –

4

Eso no es un error, es sólo una advertencia del compilador. Vector se suele establecieron los parámetros, por lo que deshacerse de la advertencia, sólo tiene que utilizar los genéricos:

Vector<Integer> moves = new Vector<Integer>(); 
moves.add(new Integer(x)); 
1
  1. inicializar su vector como esto

    Vector<Integer> moves = new Vector<Integer>(); 
    
  2. Preferiblemente utilizar java.util.ArrayList - es un reemplazo de Vector

3

Si no tiene más remedio que utilizar la estructura de datos no genérica , puede poner @SuppressWarnings("unchecked") al comienzo del método para silenciar la advertencia.

Esto solo se debe hacer si no tiene más remedio que utilizar el vector no genérico. Esto generalmente sucede cuando trabajas con bibliotecas antiguas o con ciertas partes de las bibliotecas de tiempo de ejecución de Java.

0

no directamente relacionados con el código, pero es recommended de usar (de la versión> = 5):

Integer.valueOf(x); 

en lugar de

new Integer(x); 

Porque, algunos valores enteros {-128, ..., 127) son en caché y siempre devolverá el mismo objeto. Esto es muy útil especialmente con respecto a autoboxing.

Cuestiones relacionadas