Java注释:在变量初始化,但不是赋值?

时间:2011-12-08 03:14:03

标签: java syntax annotations

我一直无法理解注释的确切位置或放置位置。

使用此方法编写的类,但会发出警告“未选中”:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();
    B cloneBoard;
    cloneBoard = (B) board.clone(); //unchecked
}

此编译无需警告:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();

    @SuppressWarnings("unchecked")
    B cloneBoard = (B) board.clone();
}

这不会编译,但会将cloneBoard标记为错误:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();
    B cloneBoard;

    @SuppressWarnings("unchecked")
    cloneBoard = (B) board.clone(); // cloneBoard cannot be resolved to a type;
                                    // VariableDeclaratorID expected
}

在关于注释的Sun教程中,我无法找到答案,为什么会这样:http://docs.oracle.com/javase/tutorial/java/javaOO/annotations.html

语法定义也没有帮助我,因为我不确定我是否理解正确:http://java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1

在我看来,这里的问题是注释可以专门用于变量,但只有在声明它们时才会使用;注释不会涵盖任何后续作业。它是否正确?有没有比为整个方法抑制未经检查的警告更优雅的解决方案?

3 个答案:

答案 0 :(得分:3)

来自Java Language Specification - Interfaces > Annotation

  

注释可以在任何声明中用作修饰符,无论是包,类,接口,字段,方法,参数,构造函数还是局部变量。

它只能在声明中使用。

答案 1 :(得分:2)

注释是声明的一部分;就像你不能写Object obj一样,除了obj被宣布之外,final obj除了final Object obj之外,@Deprecated obj被禁止也是如此。< / p>

至于优雅 - 理想情况下,你的方法不应该很长很复杂,但如果你发现你想用这个注释标记一个特定的赋值,你总是可以使用一个简单的包装方法:

@SuppressWarnings("unchecked")
private static <T extends ClassThatDeclaresCloneAsPublic> T cloneObj(T obj)
    { return (T) obj.clone(); }

(虽然在这种特殊情况下,如果你愿意,我想你可以写cloneBoard = board.getClass().cast(board.clone());并完全免除注释。)

答案 2 :(得分:1)

注释是声明的一部分(其他人已经回答了这一部分)。

但是,要回答你问题的第二部分: 当方法很短时,我从未遇到过使用此注释标记整个方法的问题。我个人更喜欢在方法/类级别而不是在方法内部进行注释,因为我认为它们会分散读者的注意力。