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


Answers

Si hace lo que sugiere y vuelve a compilar 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 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 los lugares donde sabe que el código es correcto:

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

Por ejemplo:

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



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 genéricos, puede obtener esta advertencia.

Aquí hay un breve ejemplo (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 debe convertirse al tipo real, pero este es un elenco sin marcar.




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, simplemente agregaría los parámetros

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



Related