在泛型中将@SuppressWarnings("unchecked")添加到单行生成eclipse编译器错误

Far*_*mor 32 java eclipse generics compiler-errors suppress-warnings

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

我必须将一个String转换为泛型,它会产生一个警告.

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

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

这很好用.

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

这不行.

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);
 }
Run Code Online (Sandbox Code Playgroud)

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

Joa*_*uer 51

你不能对任意表达式进行注释(但是?可能它们稍后会添加它).

但是,您可以在局部变量声明上添加注释.

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

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

@SuppressWarnings("unchecked")
T string = (T) collection.getString(attrName);
returnValue = string;
Run Code Online (Sandbox Code Playgroud)