@SuppressWarnings("unchecked") 的位置是否重要?

Ses*_*i R 6 java unchecked

我曾经使用过@SuppressWarnings("unchecked")

class SomeClass {
  public static void main(String [] args) {
    Vector v = new Vector();
    @SuppressWarnings("unchecked")
    v.addElement(new Integer(1_000_000));
    // ...        
Run Code Online (Sandbox Code Playgroud)

在使用 javac 8.0 版进行编译时,出现以下错误:

error: <identifier> expected
        v.addElement(new Integer(1_000_000));
Run Code Online (Sandbox Code Playgroud)

插入符号 (^) 指向addElement方法的左括号,还有一条错误消息抱怨缺少分号 (;)。第二条消息在 的右括号附近显示了插入符号addElement

但是,当我将@SuppressWarnings("unchecked")上面的class SomeClass{, 线移动时,如下所示:

@SuppressWarnings("unchecked")
class SomeClass {
Run Code Online (Sandbox Code Playgroud)

两个错误消息都会自动消失。这让我不知所措。定位有@SuppressWarnings("unchecked")那么关键吗?

Mic*_*ner 7

您不能像@SuppressWarnings("unchecked")在声明中那样放置注释,而只能在声明中放置注释。

这就是编译器不理解第一个变体的原因:

@SuppressWarnings("unchecked")
v.addElement(new Integer(1_000_000));
Run Code Online (Sandbox Code Playgroud)

这在那里是非法的,编译器不会理解它。

如果你想缩小范围,你可以把它放在方法上:

@SuppressWarnings("unchecked")
public static void main(String [] args) {
    Vector v = new Vector();
    v.addElement(new Integer(1_000_000));
Run Code Online (Sandbox Code Playgroud)

因此,只会main忽略该方法的警告,但不会忽略整个类。

你甚至可以把它放在变量声明上,但永远不要放在语句上:

@SuppressWarnings("unchecked")
Vector v = new Vector();
Run Code Online (Sandbox Code Playgroud)

然而,正如 GhostCat 所指出的,在这种情况下,最好只对向量进行泛化而不是忽略警告。