在generics中将@SuppressWarnings(“unchecked”)添加到单行生成eclipse编译器错误

我偶然发现了一个我不理解的奇怪行为。

我必须将一个String转换为generics,它会产生一个警告。

Type safety : Unchecked cast from String to T 
  • 如果我在方法声明上面添加@SuppressWarnings("unchecked")它可以正常工作。

  • 如果我将它添加到赋值之上,它会在eclipse中产生编译错误。

这很好用。

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

这不行。

 public  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); } 

有什么想法导致两种抑制警告方法之间的差异?

你不能在任意表达式上有注释(但是呢?也许他们稍后会添加它)。

但是,您可以对局部变量声明进行注释。

所以编译器在这里尝试做的是将returnValue解释为一个类型(因为这是唯一可以遵循方法体内注释的东西)并且失败。

在这种情况下, returnValue注释放在returnValue声明中没有帮助。 但是,您可以创建一个新的局部变量,在初始化程序中执行强制转换并对其进行注释。

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