java eclipse generics compiler-errors suppress-warnings

java - Agregar @SuppressWarnings("sin marcar") en genéricos a una sola línea genera un error de compilación de eclipse



generics compiler-errors (1)

Me he topado con un comportamiento extraño que no entiendo.

Tengo que lanzar una cadena a un genérico y está produciendo una advertencia.

Type safety : Unchecked cast from String to T

  • Si agrego @SuppressWarnings("unchecked") sobre la declaración del método, funciona bien.

  • Si lo agrego por encima de la asignación, se produce un error de compilación en eclipse.

Esto funciona bien.

@SuppressWarnings("unchecked") public <T> T search(final String query){ T returnValue = null; ... if(returnValue instanceof String){ returnValue = (T) collection.getString(attrName); }

Esto no funciona bien.

public <T> T search(final String query){ T returnValue = null; ... if(returnValue instanceof String){ @SuppressWarnings("unchecked") // Compiler error: "returnValue cannot be resolved to a type" returnValue = (T) collection.getString(attrName); }

¿Alguna idea de qué está causando la discrepancia entre los dos métodos de suprimir la advertencia?


No puede tener anotaciones en expresiones arbitrarias (¿todavía? Tal vez lo agreguen más adelante).

Sin embargo, puede tener anotaciones en declaraciones de variables locales.

Entonces, lo que el compilador intenta hacer aquí es interpretar returnValue como un tipo (ya que eso es lo único que puede seguir una anotación dentro del cuerpo del método) y falla.

Poner la anotación en la declaración de returnValue no ayuda en este caso. Sin embargo, puede crear una nueva variable local donde realice la conversión en el inicializador y anote eso.

@SuppressWarnings("unchecked") T string = (T) collection.getString(attrName); returnValue = string;