我一直无法理解注释的确切位置或放置位置。
使用此方法编写的类,但会发出警告“未选中”:
<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
在我看来,这里的问题是注释可以专门用于变量,但只有在声明它们时才会使用;注释不会涵盖任何后续作业。它是否正确?有没有比为整个方法抑制未经检查的警告更优雅的解决方案?
答案 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)
注释是声明的一部分(其他人已经回答了这一部分)。
但是,要回答你问题的第二部分: 当方法很短时,我从未遇到过使用此注释标记整个方法的问题。我个人更喜欢在方法/类级别而不是在方法内部进行注释,因为我认为它们会分散读者的注意力。