wildcards useful generic bounded are java generics compiler-construction warnings

useful - java generics wildcards



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

Por ejemplo:

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


Esta advertencia significa que su código opera en un tipo en bruto, vuelva a compilar 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<String>)this.mylist.clone(); ^ required: ArrayList<String> found: Object 1 warning

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


Esto aparece en Java 5 y Arraylist() posteriores si está utilizando colecciones sin especificadores de tipo (por ejemplo, Arraylist() lugar de ArrayList<String>() ). Significa que el compilador no puede verificar que está usando la colección de una manera segura para el tipo, usando generics .

Para deshacerse de la advertencia, solo especifique qué tipo de objetos está almacenando en la colección. Entonces, en lugar de

List myList = new ArrayList();

utilizar

List<String> myList = new ArrayList<String>();

En Java 7, puede acortar la creación de instancias genéricas utilizando Inferencia de tipos .

List<String> myList = new ArrayList<>();


La advertencia de "operaciones no seleccionadas o no seguras" se agregó cuando Java agregó Generics , si recuerdo correctamente. Por lo general, te pide que seas más explícito sobre los tipos, de una forma u otra.

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


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

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 un tipo específico.

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

El código anterior lo hará bien. Sólo el cambio está en la tercera línea después de ArrayList .


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.


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() { //... }


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.


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();