¿Qué es SuppressWarnings ("sin marcar") en Java?

Resuelto jojo asked hace 15 años • 11 respuestas

En algún momento, cuando reviso el código, veo que muchos métodos especifican una anotación:

@SuppressWarnings("unchecked")

¿Qué quiere decir esto?

jojo avatar Jul 15 '09 13:07 jojo
Aceptado

A veces, los genéricos de Java simplemente no te permiten hacer lo que quieres y necesitas decirle efectivamente al compilador que lo que estás haciendo realmente será legal en el momento de la ejecución.

Normalmente esto me resulta molesto cuando me burlo de una interfaz genérica, pero también hay otros ejemplos. Por lo general, vale la pena intentar encontrar una manera de evitar la advertencia en lugar de suprimirla (las preguntas frecuentes sobre genéricos de Java ayudan aquí), pero a veces, incluso si es posible , deforma tanto el código que suprimir la advertencia es más claro. ¡Agregue siempre un comentario explicativo en ese caso!

Las mismas preguntas frecuentes sobre genéricos tienen varias secciones sobre este tema, comenzando con "¿Qué es una advertencia" no marcada "?" - Vale la pena leerlo.

Jon Skeet avatar Jul 15 '2009 06:07 Jon Skeet

Es una anotación para suprimir las advertencias de compilación sobre operaciones genéricas no comprobadas (no excepciones), como las conversiones. Básicamente, implica que el programador no desea ser notificado sobre aquellos que ya conoce al compilar un fragmento de código en particular.

Puede leer más sobre esta anotación específica aquí:

Suprimir advertencias

Además, Oracle proporciona documentación tutorial sobre el uso de anotaciones aquí:

Anotaciones

Como ellos dicen,

"La advertencia 'sin marcar' puede ocurrir al interactuar con código heredado escrito antes de la llegada de los genéricos (que se analiza en la lección titulada Genéricos)".

dreadwail avatar Jul 15 '2009 06:07 dreadwail

También podría significar que la versión actual del sistema de tipo Java no es lo suficientemente buena para su caso. Hubo varias propuestas/trucos JSR para solucionar este problema: tokens de tipo, tokens de supertipo , Class.cast().

Si realmente necesita esta supresión, limítela tanto como sea posible (por ejemplo, no la coloque en la clase misma ni en un método largo). Un ejemplo:

public List<String> getALegacyListReversed() {
   @SuppressWarnings("unchecked") List<String> list =
       (List<String>)legacyLibrary.getStringList();

   Collections.reverse(list);
   return list;
}
akarnokd avatar Jul 15 '2009 07:07 akarnokd

Simplemente: es una advertencia mediante la cual el compilador indica que no puede garantizar la seguridad de tipos.

Método de servicio JPA, por ejemplo:

@SuppressWarnings("unchecked")
public List<User> findAllUsers(){
    Query query = entitymanager.createQuery("SELECT u FROM User u");
    return (List<User>)query.getResultList();
}

Si no anotara @SuppressWarnings("unchecked") aquí, tendría un problema con la línea donde quiero devolver mi ResultList.

En atajos, seguridad de tipos significa: Un programa se considera seguro si se compila sin errores ni advertencias y no genera ninguna ClassCastException inesperada en tiempo de ejecución.

Construyo en http://www.angelikalanger.com/GenericsFAQ/FAQSections/Fundamentals.html

Daniel Perník avatar Feb 07 '2015 22:02 Daniel Perník