java compiler-construction warnings suppress-warnings raw-types

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:

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 de String . 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.