¿Qué hace que javac emita la advertencia "usa operaciones no verificadas o no seguras"?




4 Answers

Si hace lo que sugiere y recompile con el interruptor "-Xlint: unchecked", le dará información más detallada.

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

Una vez que haya compilado 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 lugares donde sabe que el código es correcto:

@SuppressWarnings("unchecked")
public void myMethod()
{
    //...
}
java generics compiler-construction warnings

Por ejemplo:

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



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

para una función

List<String> getNames()


List names = obj.getNames();

generará este error.

Para resolverlo solo deberías agregar los parámetros.

List<String> names = obj.getNames();



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

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

import java.io.Serializable;

public class SimpleGenericClass<T> implements Serializable {

    public Serializable getInstance() {
        return this;
    }

    // @SuppressWarnings("unchecked")
    public static void main() {

        SimpleGenericClass<String> original = new SimpleGenericClass<String>();

        //  java: unchecked cast
        //    required: SimpleGenericClass<java.lang.String>
        //    found:    java.io.Serializable
        SimpleGenericClass<String> returned =
                (SimpleGenericClass<String>) original.getInstance();
    }
}

getInstance () devuelve un objeto que implementa Serializable. Esto se debe convertir al tipo real, pero se trata de un modelo sin marcar.




Para Android Studio, necesita agregar:

allprojects {

    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << "-Xlint:unchecked"
        }
    }

    // ...
}

en el archivo build.gradle de su proyecto para saber dónde se produce este error.






Related