我曾使用过@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")
的定位是否如此重要?
答案 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();