【问题标题】:Does the placement of @SuppressWarnings("unchecked") matter?@SuppressWarnings("unchecked") 的位置是否重要?
【发布时间】:2016-09-07 09:33:19
【问题描述】:

我曾经使用过@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")的定位有那么关键吗?

【问题讨论】:

  • @SuppressWarnings 习惯于很好地抑制任何抛出的警告。
  • 是的,@SuppressWarnings 注释很重要。没有它,编译器会发出警告,关于不安全的操作。你可以检查这个:codejava.net/java-core/the-java-language/…

标签: java unchecked


【解决方案1】:

您不能将@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 所指出的,在这种情况下,最好只生成向量而不是忽略警告。

【讨论】:

  • 感谢提示“最好只生成向量而不是忽略警告”。我想使用向量 v 来收集不同类型的元素。因此,我没有选择泛化它的选项。
  • @SeshadriR 你可以使用 Vector。但是,ArrayList 会更可取。
【解决方案2】:

有人可以说:你不能把这个注解放在语句上,比如v.add(1);相反,它应该继续声明,但这个答案会在这里遗漏许多重要方面。

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

从这个角度来看,您总是在可能的“最小”级别上进行注释。因此,注释会放在这里:

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

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

只需将您的代码更改为:

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

瞧,根本不需要注释了。

换句话说:你的工作方式是“从内到外”。含义:如果您需要禁止显示警告,您首先选择发出警告的各个变量。只有当你在一个方法中得到太多这样的语句时,你才把注释放在方法上。你永远不想注释整个班级。因为这会抑制整个班级的所有此类警告。

老实说:真正在这里学到的教训:学习你正在使用的概念。编译器向您发出警告,因为您使用的是 raw 类型(通过在声明 v 时省略类型参数)。然后忽略该警告是错错错。你弄清楚警告告诉你什么,然后你修复你的代码!

“好代码”完全没有警告;并且它有尽可能少的“抑制”注释!

【讨论】:

  • +1 用于指出“真正的”解决方案,但您可能还应该指出为什么它不能放在声明中
【解决方案3】:

是的,此注释的放置与任何其他注释事项一样,这是由注释 @Target 定义的,用于此注释本身的定义。

@SupressWarnings

@Target(value={TYPE,FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE})

但是你把它放在一个不属于上述的声明上。你至少应该把它放在局部变量声明层:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-29
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多