似乎在编译期间不考虑@SuppressWarnings

时间:2014-10-31 04:43:29

标签: java

为了试验@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方法声明之前移动注释,则会禁止警告。 这里缺少什么?

感谢。

2 个答案:

答案 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);

    }

 }

请记住,这只是用于注释的实验。理想的解决方案是使用泛型而不是原始类型。