2011-09-12 18 views
26

Me he topado con un comportamiento extraño que no entiendo.Agregar @SuppressWarnings ("desmarcado") en genéricos a una sola línea genera error del compilador de eclipse

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

Type safety : Unchecked cast from String to T 
  • Si añado @SuppressWarnings("unchecked") por encima de la declaración de método que trabaja muy bien.

  • Si lo agrego arriba de la asignación, 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é causa la discrepancia entre los dos métodos para suprimir la advertencia?

Respuesta

41

No puede tener una anotación en expresiones arbitrarias (¿aún? Tal vez lo agregarán más adelante).

Usted puede sin embargo, tienen anotaciones en las declaraciones de variables locales.

Así que lo que el compilador intenta que hacer aquí es interpretar returnValue como un tipo (ya que es el único que puede seguir a una anotación en el interior de un cuerpo de 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 el molde en el inicializador y anotar eso.

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

Vine aquí, porque no entiendo el error _ "Error de sintaxis en 'Resultados' tokens, VariableDeclaratorId espera después de esta señal" _ en Eclipse. Tu explicación de lo que intenta el compilador y por qué falla es genial. Solo agregue este comentario, en caso de que alguien más busque este error de sintaxis. – user1438038

Cuestiones relacionadas