2011-03-14 12 views
32

Aquí está el código que he escrito?¿Cómo reparar la advertencia de llamada desmarcada en Java?

Set keys = map.keySet(); 
SortedSet s = new TreeSet(keys); 

La advertencia que estoy recibiendo es:

warning: [unchecked] unchecked call to TreeSet(java.util.Collection<? extends E>) as a 
     member of the raw type java.util.TreeSet 

¿Cómo deshacerse de la advertencia del compilador?

+2

Tendríamos que ver más de su código (para ver el contexto). Sospecho que es porque no estás usando genéricos y no estás emitiendo, pero de nuevo ... si no publicas el código que está causando la advertencia, no podemos hacer otra cosa que adivinar. –

Respuesta

43

Idealmente, comience a usar genéricos por completo. No ha mostrado lo que el tipo de map es, pero lo ideal es que sea capaz de escribir algo como:

Set<String> keys = map.keySet(); 
SortedSet<String> s = new TreeSet<String>(keys); 

que sería en el caso en map era algo así como un Map<String, Integer>.

Si map es un tipo crudo, es más difícil, de nuevo, la mejor solución sería comenzar a agregar genéricos a lo largo de su código base, eliminando los tipos sin procesar. Eso no siempre es posible si el mapa es devuelto por un código de un tercero, por supuesto. En ese caso, es posible que deba suprimir las advertencias en una línea al convertir de tipos sin formato a tipos genéricos, posiblemente a través de Collections.checkedCollection, pero después de eso, debería poder trabajar con el tipo genérico "correctamente". Por ejemplo:

@SuppressWarnings("unchecked") // Just for this one statement 
Collection<String> keys = Collections.checkedCollection(map.keySet(), 
                 String.class); 

// Now this statement is fully generic with no warnings 
SortedSet<String> s = new TreeSet<String>(keys); 
23

En lo que se refiere a este problema, debe utilizar las teclas de tipo parametrizado por ejemplo

Set<TypeOfKeyObject> keys = map.keySet(); 
SortedSet<TypeOfKeyObject> s = new TreeSet<TypeOfKeyObject>(keys); 

donde TypeOfKeyObject es el tipo de objeto de Key en su objeto map.

puede forzar suprimir las advertencias (como ya se sugirió correctamente) pero no es aconsejable.

A riesgo de sonar condescendiente, le sugiero que estudie genéricos. Un buen punto de partida sería este: http://www.angelikalanger.com/GenericsFAQ/JavaGenericsFAQ.html

+10

"Utilizar tipo parametrizado de teclas" es la respuesta correcta y es suficiente. Decirle al OP "Necesitas estudiar genéricos" es condescendiente. Si hubiéramos estudiado, no necesitaríamos SO, ¿o sí? No obstante, voté a favor. :-P –

+11

No le está dando pescado ni le está enseñando a pescar; le estás diciendo que eche un vistazo a un libro sobre la pesca de la biblioteca. – Paul

+3

Le di el pescado en el segundo párrafo. El libro sobre la pesca es una forma de decirle cómo pescar dado nuestro medio de comunicación. :) Tómalo con calma. – Nishant

Cuestiones relacionadas