为了试验@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.

如果我将注释移到主方法声明之前,那么将禁止显示警告。
这里缺少什么?

谢谢。

最佳答案

编译器告诉您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选项会发出警告。

10-06 14:05