我曾经使用过@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")那么关键吗?
您不能像@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 所指出的,在这种情况下,最好只对向量进行泛化而不是忽略警告。