将泛型中的@SuppressWarnings(“unchecked”)添加到单行会生成 eclipse 编译器错误

我偶然发现了一个我不明白的奇怪行为。

我必须将字符串转换为泛型,并且它会产生警告。

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

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

这工作正常。

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

这不能正常工作。

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

任何想法是什么导致了两种抑制警告的方法之间的差异?


答案 1

你不能对任意表达式进行批注(还吗?也许他们稍后会添加它)。

但是,您可以在局部变量声明上设置批注。

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

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

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

答案 2

推荐