@SuppressWarnings("未经检查")的展示位置是否重要?

时间:2016-09-07 09:33:19

标签: 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));
    // ...        

在使用javac 8.0版编译时,我收到以下错误:

error: <identifier> expected
        v.addElement(new Integer(1_000_000));

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

但是,当我将@SuppressWarnings("unchecked")移到class SomeClass{之上时,行,如:

@SuppressWarnings("unchecked")
class SomeClass {

两个错误消息都自动消失。这让我感到困惑。 @SuppressWarnings("unchecked")的定位是否如此重要?

3 个答案:

答案 0 :(得分:4)

您不得将@SuppressWarnings("unchecked")之类的注释放在声明上,而只能放在声明上。

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

@SuppressWarnings("unchecked")
v.addElement(new Integer(1_000_000));

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

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

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

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

你甚至可以将它放在变量声明上,但绝不会在声明中:

@SuppressWarnings("unchecked")
Vector v = new Vector();

然而,正如GhostCat指出的那样,在这种情况下,最好只是对矢量进行生成而不是忽略警告。

答案 1 :(得分:2)

可以说:您不能将此注释放在语句上,例如v.add(1);相反,它应该继续声明,但这个答案会在这里留下许多重要的方面。

事情是:你可以使用注释来防止编译器一方面给你警告。另一方面,您只想抑制您理解的那些警告,并且您认为“可以被抑制”。

从这个角度来看,你总是可以在“最小”的水平上进行注释。因此,注释将在这里:

@SuppressWarnings("unchecked")
Vector v = new Vector();

但当然,在您的情况下,警告绝对有效;并且压制它错误

只需将您的代码更改为:

Vector<Integer> v = new Vector<>();

并且不再需要注释。

换句话说:你从“从里到外”工作。含义:如果您需要抑制警告,首先要选择能够发出警告的单个变量。只有当你在一个方法中得到太多这样的语句时,才将注释放在方法上。你永远不想要注释整个班级。因为那会压制全班的所有这些警告。

老实说:这里学到的真正的课程:学习您正在使用的概念。编译器会发出警告,因为您使用的是原始类型(在声明v时省略了type参数)。然后忽略该警告是错误的错误。您可以看出警告告诉您的内容,然后您修改代码!

“好代码”完全没有警告;它尽可能少地“压制”注释!

答案 2 :(得分:0)

是这个注释的位置与任何其他注释一样重要,这是由注释本身的定义中使用的注释@Target定义的。

对于@SupressWarnings,它是

  

@Target(值= {TYPE,字段,方法,参数,构造函数,LOCAL_VARIABLE})

但你把它放在一个不属于上述声明的声明中。您至少应该将它放在局部变量声明级别:

@SuppressWarnings("unchecked")
Vector v = new Vector();