为了试验@SuppressWarnings
注释,我编写了以下示例程序:
public class Test {
public static void main(String[] args) {
@SuppressWarnings("unchecked")
Set set = new HashSet();
Integer obj = new Integer(100);
set.add(obj);
}
}
但即使在这个注释之后,我在控制台上得到以下输出:
Note: Test.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
如果我在main方法声明之前移动注释,则会禁止警告。 这里缺少什么?
感谢。
答案 0 :(得分:5)
编译器告诉您Recompile with -Xlint:unchecked for details.
这样做提供了上下文:当您使用@SuppressWarnings
注释声明时,您也将泛型方法称为原始操作。
Test.java:9: warning: [unchecked] unchecked call to add(E) as a member of the raw type Set
set.add(obj);
^
where E is a type-variable:
E extends Object declared in interface Set
如果您将@SuppressWarnings
移动到main
方法作为一个整体,警告就会消失。
The JLS section on @SuppressWarnings
说:
如果程序声明使用注释
@SuppressWarnings
[...]注释,则Java编译器不得报告任何警告[...]如果该警告已生成结果为注释声明或其任何部分。(我的大胆)
您的示例代码仅抑制局部变量声明,而不是方法声明。
<强>更新强>
奇怪的是,即使你明显得到的信息在技术上也不是警告,而是一张便条。使用-Werror
进行编译就可以了。使用-Xlint
选项会使其成为警告。
答案 1 :(得分:0)
以下将是没有编译时警告的程序:
import java.util.*;
public class Test {
@SuppressWarnings("unchecked")
public static void main(String[] args){
Set set = new HashSet();
Integer obj = new Integer(100);
set.add(obj);
}
}
请记住,这只是用于注释的实验。理想的解决方案是使用泛型而不是原始类型。