Java 6: advertencia de @SuppressWarnings("tipo de raw") no compatible
compiler-construction suppress-warnings (2)
Me mudé a una nueva máquina que tiene el último compilador Java de Sun y noté algunas advertencias en el código Java 6 existente. El Eclipse IDE, sugirió que anote la tarea con:
@SuppressWarnings("rawtypes")
Por ejemplo:
class Foo<T> {
...
}
...
@SuppressWarnings("rawtypes")
Foo foo = new Foo();
Cuando volví a la máquina con el compilador anterior (JDK 1.6.0_20), me he dado cuenta de que este compilador anterior ahora advierte sobre la supresión de las advertencias de "tipos de raw", afirmando que esta supresión no es compatible y propone reemplazarla con @SuppressWarnings ("desenfrenado"). Además, hubo algunos lugares que el compilador más nuevo, de forma predeterminada, me hizo poner tanto "sin marcar" como "tipos de raw": compilar ese código con el compilador anterior reproduce la misma advertencia.
¿Cómo puedo hacer cumplir la compatibilidad hacia atrás / adelante entre los dos, para que ninguno de los compiladores produzca advertencias?
Puede usar @SuppressWarnings("unchecked")
que es compatible tanto con el compilador de eclipse como con javac.
Pero recuerde que la anotación @SuppressWarnings
es utilizada por su compilador que puede tener sus propios valores. El JLS solo obliga al compilador a comprender los valores "sin comprobar" y "en desuso" (por ahora).
Los proveedores de compiladores deben documentar los nombres de advertencia que admiten junto con este tipo de anotación. Se les anima a cooperar para garantizar que los mismos nombres funcionen en múltiples compiladores .
Si usa Helios, deberá establecer una opción específica para permitir @SuppressWarnings("unchecked")
lugar de @SuppressWarnings("rawtypes")
,
En caso de que no sea posible actualizar el código con el nuevo token, se puede establecer la propiedad del sistema
suppressRawWhenUnchecked=true
al iniciar Eclipse.
Recursos:
- JLS - @SuppressWarnings ()
- Eclipse JDT ( Java Compiler , nuevo token "rawtypes" para la anotación @SuppressWarnings )
EDITAR: Aquí está el artículo de knol ahora no disponible que se utilizó como referencia, originalmente escrito por Alex Miller .
@SuppressWarnings Anotación en Java
Anotación estándar para suprimir varias advertencias
La anotación SuppressWarnings se agregó como una anotación estándar en Java SE 5.
Definición
La anotación @SuppressWarnings se define en la Especificación del lenguaje Java sección 9.6.1.5 . Esta sección dice:
El tipo de anotación
SuppressWarnings
admite el control del programador sobre las advertencias emitidas por el compilador de Java. Contiene un solo elemento que es una matriz deString
. Si una declaración de programa está anotada con la anotación@SuppressWarnings(value = {S1, ... , Sk})
, entonces un compilador de Java no debe informar ninguna advertencia identificada por uno de S1, ..., Sk si esa advertencia hubiera generado como resultado de la declaración anotada o cualquiera de sus partes.Las advertencias no
unchecked
se identifican con la cadena "unchecked
".La section siguiente sobre
@Deprecation
también menciona que estas advertencias se pueden suprimir con@SuppressWarnings("deprecation")
.Tipos de advertencia válidos
Las dos únicas cadenas de advertencia que se mencionan en la especificación en sí están "desmarcadas" y "desaprobadas". Sin embargo, Sun JDK usa un conjunto de cadenas más grande en el compilador. Puede determinar el conjunto actual ejecutando:
javac -X
que le mostrará (entre otras cosas) las configuraciones válidas para -Xlint.
Por ejemplo, Sun JDK 1.5 muestra:
- todo: suprime todas las advertencias de este código
- desaprobación: suprima las advertencias del uso de código obsoleto
- desmarcado: suprime las advertencias de una llamada sin marcar o un lanzamiento sin marcar
- Fallthrough: suprime las advertencias si se produce un cambio sin encontrar un caso válido (y no predeterminado)
- camino -
- serial - suprime las advertencias si una clase Serializable no define un serialVersionUID
- finalmente - suprime las advertencias de retorno dentro de un final (que ignorará el retorno con el intento)
Y Sun JDK 1.6 agrega:
- emitir
- divzero - suprime las advertencias si se detecta un entero dividir por cero
- vacío
- anula
- ninguna
Los IDE y las herramientas de análisis estático generalmente admiten una gran cantidad de otros valores posibles para @SuppressWarnings. Estos valores corresponden a comprobaciones específicas de análisis estático realizadas por el IDE.
Eclipse
Los valores de advertencia de Eclipse para Eclipse 3.3 están documentados en los documentos de JDT .
- todo: suprime todas las advertencias
- boxeo: suprima las advertencias relativas a las operaciones de boxeo / desempaquetado
- emitir - suprimir advertencias relativas a las operaciones de reparto
- dep-ann: suprime las advertencias relativas a la anotación obsoleta
- desaprobación: suprima las advertencias relativas a la desaprobación
- Fallthrough: suprime las advertencias relativas a los saltos faltantes en las instrucciones de cambio
- finalmente, suprima las advertencias relativas al bloqueo final que no regresan
- ocultar: suprimir las advertencias relativas a los locales que ocultan variables
- Interruptor incompleto: suprime las advertencias relativas a las entradas faltantes en una instrucción switch (enum case)
- nls - suprime advertencias relativas a literales de cadena no-nls
- nulo: suprime las advertencias relativas al análisis nulo
- restricción: suprime las advertencias relativas al uso de referencias desalentadas o prohibidas
- serial: suprime las advertencias relativas al campo serialVersionUID faltante para una clase serializable
- acceso estático: suprime las advertencias relativas al acceso estático incorrecto
- acceso sintético: suprime las advertencias relativas al acceso no optimizado de las clases internas
- sin marcar: suprima las advertencias relativas a las operaciones no verificadas
- acceso de campo no calificado: suprime advertencias relativas al acceso de campo no calificado
- sin usar: suprima las advertencias relativas al código no utilizado
IntelliJ
NetBeans
Ejemplos
Un ejemplo de especificar una sola advertencia:
@SuppressWarnings("unchecked") public void methodWithScaryWarnings() { List rawList = new ArrayList(); List<String> stringList = (List<String>)rawList; }
Un ejemplo de usar dos advertencias:
@SuppressWarnings({"unchecked","deprecation"}) public void methodWithScaryWarnings() { callDeprecatedMethod(); }
Tenga en cuenta que Eclipse 3.5 no entiende los tipos de raw y marca una advertencia para cambiar a no seleccionado. Es frustrante que a Eclipse se le ocurriera la anotación de los tipos de rawtse que causa más problemas que la solución. Deberían haberse quedado con el estándar.