G. *_*ach 5 java syntax annotations
我一直在理解必须在哪里或可以放置注释的确切位置上遇到麻烦。
带有该方法的类可以编译,但会发出“未选中”警告:
<B extends BitSet> void doStuff(LinkedList<B> list) {
B board = list.getFirst();
B cloneBoard;
cloneBoard = (B) board.clone(); //unchecked
}
Run Code Online (Sandbox Code Playgroud)
编译时没有警告:
<B extends BitSet> void doStuff(LinkedList<B> list) {
B board = list.getFirst();
@SuppressWarnings("unchecked")
B cloneBoard = (B) board.clone();
}
Run Code Online (Sandbox Code Playgroud)
这不会编译,但会将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
}
Run Code Online (Sandbox Code Playgroud)
在有关注解的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
在我看来,这里的问题是注释可以专门用于变量,但只能在声明时使用。以后的任何分配都不会被注释覆盖。它是否正确?是否有比抑制整个方法的未经检查的警告更优雅的解决方案?
注释是声明的一部分;就像你不能写Object objexcept at the point whereobj声明一样,也不能final obj写 except as final Object obj,所以也被@Deprecated obj禁止。
至于优雅 - 无论如何,理想情况下你的方法不应该很长和复杂,但是如果你确实发现你想用这个注释来标记特定的赋值,你总是可以使用一个简单的包装方法:
@SuppressWarnings("unchecked")
private static <T extends ClassThatDeclaresCloneAsPublic> T cloneObj(T obj)
{ return (T) obj.clone(); }
Run Code Online (Sandbox Code Playgroud)
(尽管在这种特定情况下,如果您愿意,我想您可以cloneBoard = board.getClass().cast(board.clone());完全编写并省去注释。)