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=trueal 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
SuppressWarningsadmite 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
uncheckedse identifican con la cadena "unchecked".La section siguiente sobre
@Deprecationtambié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 -Xque 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.