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

Java注释:在变量初始化时,而不是赋值时?,java,syntax,annotations,Java,Syntax,Annotations,我一直很难理解注释必须或可以放置在什么地方 使用此方法的类将编译,但会发出警告“未选中”: void doStuff(链接列表){ B board=list.getFirst(); B隔板; cloneBoard=(B)board.clone();//未选中 } 这在没有警告的情况下编译: <B extends BitSet> void doStuff(LinkedList<B> list) { B board = list.getFirst(); @

我一直很难理解注释必须或可以放置在什么地方

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

void doStuff(链接列表){
B board=list.getFirst();
B隔板;
cloneBoard=(B)board.clone();//未选中
}
这在没有警告的情况下编译:

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

    @SuppressWarnings("unchecked")
    B cloneBoard = (B) board.clone();
}
void doStuff(链接列表){
B board=list.getFirst();
@抑制警告(“未选中”)
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
}
void doStuff(链接列表){
B board=list.getFirst();
B隔板;
@抑制警告(“未选中”)
cloneBoard=(B)board.clone();//cloneBoard无法解析为类型;
//应为VariableDeclaratorID
}
在Sun关于注释的教程中,我找不到一个关于为什么会这样的答案:

语法定义对我也没有帮助,因为我不太确定我是否正确理解了它:


在我看来,这里的问题在于注释可以专门用于变量,但只有在声明变量时才可以;注释将不包括任何以后的赋值。这是正确的吗?对于整个方法,还有比抑制未检查的警告更优雅的解决方案吗?

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

但是,要回答问题的第二部分:
当这个方法如此简短时,我从来没有遇到过用这个注释标记整个方法的问题。我个人更喜欢方法/类级别的注释,而不是方法内部的注释,因为我认为它们只会分散读者的注意力。

注释是声明的一部分;正如除了在声明
obj
的位置之外,您不能写入
objectobj
,也不能将
final obj
作为
final Object obj
写入一样,
@不推荐的obj
也是禁止的

至于优雅-无论如何,理想情况下,您的方法不应该太长和复杂,但如果您确实发现您希望使用此注释标记特定的赋值,则始终可以使用简单的包装器方法:

@SuppressWarnings("unchecked")
private static <T extends ClassThatDeclaresCloneAsPublic> T cloneObj(T obj)
    { return (T) obj.clone(); }
@SuppressWarnings(“未选中”)
专用静态T cloneObj(T obj)
{return(T)obj.clone();}
(虽然在这个特定的例子中,我想您可以编写
cloneBoard=board.getClass().cast(board.clone());
,如果需要的话,可以完全省去注释。)

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


它只能在声明中使用。

Woah,您的回答比我预期的要快得多,谢谢!他们都很有帮助;我接受了ruakh的答案,因为第一部分很有用(特别是代码部分)。如果你想知道为什么今天又得到+15,我想知道在这么长时间后是否真的有可能“不接受”一个答案:P
@SuppressWarnings("unchecked")
private static <T extends ClassThatDeclaresCloneAsPublic> T cloneObj(T obj)
    { return (T) obj.clone(); }