2008-10-13 13 views

Respuesta

287

Esto viene a colación en Java 5 y más tarde si está utilizando colecciones sin especificadores de tipo (por ejemplo, en lugar de Arraylist()ArrayList<String>()). Significa que el compilador no puede verificar que está utilizando la colección de forma segura, usando generics.

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

List myList = new ArrayList(); 

uso

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

En Java 7 se puede acortar ejemplificación genérica mediante el uso de Type Inference.

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

En Java 7, recibí la misma advertencia incluso con * Type Interference * con esta colección: 'ConcurrentHashMap objs = new ConcurrentHashMap()' – Lucio

+8

@Lucio Aún necesita los corchetes angulares. 'nuevo ConcurrentHashMap <>()' –

+3

Solo para señalar, esto no es colecciones específicas. Obtiene el error porque el compilador de Java no puede garantizar la seguridad del tipo en general. Por ejemplo, la misma advertencia se produce con el siguiente código: AbstractMap.SimpleEntry entry = new AbstractMap.SimpleEntry ("hello", "world"); – semonte

5

por ejemplo cuando llama a una función que devuelve colecciones genéricas y usted 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 usted acaba de agregar los parámetros

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

Se añadió la advertencia de "operaciones sin marcar, o inseguros" cuando java añadió 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(); activa esa advertencia porque javac está buscando ArrayList<String> foo = new ArrayList<String>();

151

Si hace lo que sugiere y vuelve a compilar con el modificador "-Xlint: desmarcado", le dará más información detallada.

Además del uso de tipos sin procesar (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, se puede decidir suprimir la advertencia en los lugares donde se sabe que el código es correcto: significa

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

Deseo más la gente votó positivamente esta respuesta. Respaldo mi selección de la respuesta de @Bill the Lizard, pero esta respuesta está cerca de mi corazón por mostrarme que la respuesta me estaba mirando a la cara en la advertencia en sí misma, así como la elaboración de otra razón para encontrar el error. – toolbear

+0

¡Esta es la respuesta definitiva! – russellhoff

10

Esta advertencia de que el código funciona en un tipo de crudo, volver a compilar el ejemplo con el

-Xlint:unchecked 

para obtener los detalles

así:

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.or Acle.com lo explica aquí: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html

+0

Esto no agrega mucho a las respuestas ya existentes. – Makoto

+0

Creo que sí. Él enlaces a la documentación de Oracle para esta advertencia exacta. –

0

La solución sería utilizar 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);

encima de código generan calentamiento porque ArrayList no es de tipo específico.

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

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

1

Solo quiero agregar un ejemplo del tipo de advertencia no revisada 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í es una breve (y algo tonto) ejemplo 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.

Cuestiones relacionadas