Qué provoca que javac emita la advertencia “usa las operaciones no verificadas o inseguras”

Por ejemplo:

javac Foo.java Note: Foo.java uses unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 

Esto aparece en Java 5 y posteriores si está utilizando colecciones sin especificadores de tipo (por ejemplo, Arraylist() lugar de ArrayList() ). Significa que el comstackdor no puede verificar si está utilizando la colección de forma segura, utilizando generics .

Para deshacerse de la advertencia, solo sea específico sobre qué tipo de objetos está almacenando en la colección. Entonces, en lugar de

 List myList = new ArrayList(); 

utilizar

 List myList = new ArrayList(); 

En Java 7 puede acortar la instanciación genérica mediante el uso de la inferencia de tipo .

 List myList = new ArrayList<>(); 

Si hace lo que sugiere y vuelve a comstackr con el modificador “-Xlint: unchecked”, le dará información más detallada.

Además del uso de tipos crudos (como se describe en las otras respuestas), un lanzamiento no verificado también puede causar la advertencia.

Una vez que haya comstackdo con -Xlint, debería poder volver a trabajar su código para evitar la advertencia. Esto no siempre es posible, especialmente si se está integrando con un código heredado que no se puede cambiar. En esta situación, puede decidir suprimir la advertencia en los lugares donde sabe que el código es correcto:

 @SuppressWarnings("unchecked") public void myMethod() { //... } 

Esta advertencia significa que su código opera en un tipo sin procesar, recompile el ejemplo con el

 -Xlint:unchecked 

para obtener los detalles

Me gusta esto:

 javac YourFile.java -Xlint:unchecked Main.java:7: warning: [unchecked] unchecked cast clone.mylist = (ArrayList)this.mylist.clone(); ^ required: ArrayList found: Object 1 warning 

docs.oracle.com habla sobre esto aquí: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

por ejemplo, cuando llama a una función que devuelve colecciones genéricas y no especifica los parámetros generics usted mismo.

para una función

 List getNames() List names = obj.getNames(); 

generará este error.

Para resolverlo, simplemente agregaría los parámetros

 List names = obj.getNames(); 

La advertencia de “operaciones no verificadas o inseguras” se agregó cuando Java agregó Generics , si no recuerdo mal. Por lo general, le pide que sea más explícito sobre los tipos, de una forma u otra.

Por ejemplo. el código ArrayList foo = new ArrayList(); desencadena esa advertencia porque javac está buscando ArrayList foo = new ArrayList();

Solo quiero agregar un ejemplo del tipo de advertencia sin marcar que veo con bastante frecuencia. Si usa clases que implementan una interfaz como Serializable, a menudo llamará a métodos que devuelven objetos de la interfaz, y no la clase real. Si la clase devuelta se debe convertir a un tipo basado en generics, puede obtener esta advertencia.

Aquí hay un breve ejemplo (y algo tonto) para demostrar:

 import java.io.Serializable; public class SimpleGenericClass implements Serializable { public Serializable getInstance() { return this; } // @SuppressWarnings("unchecked") public static void main() { SimpleGenericClass original = new SimpleGenericClass(); // java: unchecked cast // required: SimpleGenericClass // found: java.io.Serializable SimpleGenericClass returned = (SimpleGenericClass) original.getInstance(); } } 

getInstance () devuelve un objeto que implementa Serializable. Esto debe convertirse al tipo real, pero este es un elenco sin marcar.

La solución sería usar un tipo específico en <> como ArrayList .

ejemplo:

 File curfolder = new File( "C:\\Users\\username\\Desktop"); File[] file = curfolder.listFiles(); ArrayList filename = Arrays.asList(file); 

el código anterior genera una advertencia porque ArrayList no es de tipo específico.

 File curfolder = new File( "C:\\Users\\username\\Desktop"); File[] file = curfolder.listFiles(); ArrayList filename = Arrays.asList(file); 

el código anterior funcionará bien. Solo el cambio está en tercera línea después de ArrayList .