Estoy creando algunas clases dinámicamente usando sun.misc.Unsafey está dando estos consejos en la salida
Davut Gürbüz
Respuestas:
392
Esto aparece en Java 5 y versiones posteriores si está utilizando colecciones sin especificadores de tipo (por ejemplo, en Arraylist()lugar de ArrayList<String>()). Significa que el compilador no puede verificar que está utilizando la colección de forma segura, usando genéricos .
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 =newArrayList();
utilizar
List<String> myList =newArrayList<String>();
En Java 7, puede acortar la creación de instancias genéricas mediante la inferencia de tipos .
En Java 7, recibí la misma advertencia incluso usando Type Interference con esta colección:ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
Lucio
13
@Lucio Todavía necesitas paréntesis angulares. new ConcurrentHashMap<>()
Bill the Lizard
3
Solo para señalar, esto no es específico de las colecciones. Obtiene el error porque el compilador de Java no puede garantizar la seguridad de los tipos en general. Por ejemplo, se genera la misma advertencia con el siguiente código: AbstractMap.SimpleEntry <String, String> entry = new AbstractMap.SimpleEntry ("hello", "world");
Si hace lo que sugiere y vuelve a compilar con el interruptor "-Xlint: desmarcado", le dará información más detallada.
Además del uso de tipos sin formato (como se describe en las otras respuestas), un reparto sin control también puede causar la advertencia.
Una vez que haya compilado con -Xlint, debería poder modificar su código para evitar la advertencia. Esto no siempre es posible, especialmente si se está integrando con 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:
Desearía que más personas votaran 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 directamente a la cara en la advertencia en sí misma, así como elaborar otra razón para encontrar el error.
toolbear
1
Esta es la respuesta final!
russellhoff
¡Esta respuesta debería haber sido marcada como solución! ¡Gracias!
gracias, descubrí de dónde proviene mi advertencia al agregar esto
JackOuttaBox
Recibo esta advertencia y AS muestra una clase donde se produjo. Y esto no es un error, solo una advertencia. ¿Por qué deberíamos agregar esta opción? ¿No se mostró una clase de problema en su situación?
CoolMind
Lol, acabo de responder la pregunta, y no , el problema no se muestra hasta que agregue esto.
Borzh
16
Esta advertencia significa que su código opera en un tipo sin formato, vuelva a compilar el ejemplo con
La advertencia de "operaciones no verificadas o inseguras" se agregó cuando Java agregó Genéricos , 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á buscandoArrayList<String> foo = new ArrayList<String>();
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 métodos que devuelven objetos de la interfaz, y no la clase real. Si la clase que se devuelve debe convertirse a un tipo basado en genéricos, puede obtener esta advertencia.
Aquí hay un breve (y algo tonto) ejemplo para demostrar:
import java.io.Serializable;publicclassSimpleGenericClass<T>implementsSerializable{publicSerializable getInstance(){returnthis;}// @SuppressWarnings("unchecked")publicstaticvoid main(){SimpleGenericClass<String> original =newSimpleGenericClass<String>();// java: unchecked cast// required: SimpleGenericClass<java.lang.String>// found: java.io.SerializableSimpleGenericClass<String> returned =(SimpleGenericClass<String>) original.getInstance();}}
getInstance () devuelve un objeto que implementa Serializable. Esto se debe convertir al tipo real, pero este es un reparto no verificado.
Tengo ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;. Debido a que valuees una estructura compleja (quiero limpiar JSON ), puede ocurrir cualquier combinación de números, booleanos, cadenas, matrices. Entonces, usé la solución de @Dan Dyer:
sun.misc.Unsafe
y está dando estos consejos en la salidaRespuestas:
Esto aparece en Java 5 y versiones posteriores si está utilizando colecciones sin especificadores de tipo (por ejemplo, en
Arraylist()
lugar deArrayList<String>()
). Significa que el compilador no puede verificar que está utilizando la colección de forma segura, usando genéricos .Para deshacerse de la advertencia, solo sea específico sobre qué tipo de objetos está almacenando en la colección. Entonces, en lugar de
utilizar
En Java 7, puede acortar la creación de instancias genéricas mediante la inferencia de tipos .
fuente
ConcurrentHashMap<Integer, Object> objs = new ConcurrentHashMap()
new ConcurrentHashMap<>()
-Xlint:unchecked
con MAVENSi hace lo que sugiere y vuelve a compilar con el interruptor "-Xlint: desmarcado", le dará información más detallada.
Además del uso de tipos sin formato (como se describe en las otras respuestas), un reparto sin control también puede causar la advertencia.
Una vez que haya compilado con -Xlint, debería poder modificar su código para evitar la advertencia. Esto no siempre es posible, especialmente si se está integrando con 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:
fuente
Para Android Studio, debe agregar:
en el archivo build.gradle de su proyecto para saber dónde se produce este error.
fuente
Esta advertencia significa que su código opera en un tipo sin formato, vuelva a compilar el ejemplo con
para obtener los detalles
Me gusta esto:
docs.oracle.com habla sobre esto aquí: http://docs.oracle.com/javase/tutorial/java/generics/rawTypes.html
fuente
Tuve clases de 2 años y algunas clases nuevas. Lo resolví en Android Studio de la siguiente manera:
En mi proyecto build.gradle file ( solución de Borzh )
Y luego, si queda algo de Metheds:
fuente
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
generará este error.
Para resolverlo, simplemente agregaría los parámetros
fuente
La advertencia de "operaciones no verificadas o inseguras" se agregó cuando Java agregó Genéricos , 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á buscandoArrayList<String> foo = new ArrayList<String>();
fuente
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 métodos que devuelven objetos de la interfaz, y no la clase real. Si la clase que se devuelve debe convertirse a un tipo basado en genéricos, puede obtener esta advertencia.
Aquí hay un breve (y algo tonto) ejemplo para demostrar:
getInstance () devuelve un objeto que implementa Serializable. Esto se debe convertir al tipo real, pero este es un reparto no verificado.
fuente
La solución sería usar un tipo específico en
<>
likeArrayList<File>
.ejemplo:
el código anterior genera advertencia porque
ArrayList
no es de tipo específico.el código anterior lo hará bien. Solo el cambio está en la tercera línea después
ArrayList
.fuente
Puede mantenerlo en forma genérica y escribirlo como:
Establecer el tipo de ArrayList como Object nos da la ventaja de almacenar cualquier tipo de datos. No necesita usar -Xlint ni nada más.
fuente
Esta advertencia también podría surgir debido a
nuevo HashMap () o new ArrayList () que es de tipo genérico tiene que ser específico; de lo contrario, el compilador generará una advertencia.
Asegúrese de que si su código contiene lo siguiente, tiene que cambiar en consecuencia
new HashMap () => Map map = new HashMap () new HashMap () => Map map = new HashMap <> ()
new ArrayList () => List map = new ArrayList () new ArrayList () => List map = new ArrayList <> ()
fuente
Tengo
ArrayList<Map<String, Object>> items = (ArrayList<Map<String, Object>>) value;
. Debido a quevalue
es una estructura compleja (quiero limpiar JSON ), puede ocurrir cualquier combinación de números, booleanos, cadenas, matrices. Entonces, usé la solución de @Dan Dyer:fuente