我偶然发现了一个我不理解的奇怪行为。
我必须将一个String转换为泛型,并且它会产生警告。
Type safety : Unchecked cast from String to T
如果我在方法声明上方添加@SuppressWarnings("unchecked")
它工作正常。
如果我将其添加到赋值之上,则会产生编译错误 蚀。
这很好用。
@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);
}
知道是什么导致了两种抑制警告方法之间的差异?
答案 0 :(得分:50)
你不能对任意表达式进行注释(但是?可能以后会添加它)。
你可以但是在局部变量声明上有注释。
那么编译器尝试在这里做的是将returnValue
解释为一种类型(因为这是唯一可以遵循方法体内注释的东西)并且失败。
将注释放在returnValue
的声明上对这种情况没有帮助。但是,您可以创建一个新的局部变量,在初始化程序中执行强制转换,并对其进行注释。
@SuppressWarnings("unchecked")
T string = (T) collection.getString(attrName);
returnValue = string;