这段代码有效吗?
public abstract class A {
protected static final String c = "my const";
}
@myAnnotation(value=A.c)
public class B extends A {
}
带有JDK 1.6.0.23的 Eclipse
接受此,但Maven
2.2.1与JDK 1.6.0.23显示以下编译错误:
c在A
中具有受保护的访问权限
答案 0 :(得分:3)
感谢@adranale的评论,我在Access Control的Java语言规范部分找到了不同的答案。我不认为它应该以这种方式工作,但有关“受保护”的相关文字读取
设C是声明受保护成员m的类。只允许在C的子类S的主体内访问。
类的主体是大括号中的所有代码。类anotations在大括号之外,因此它们没有访问权限。有趣的是,这个逻辑不适用于类体内的方法,参数,字段或局部变量注释。
答案 1 :(得分:2)
您尝试使用“const”填充的注释尝试使用无法工作的protected从外部访问该类。 Eclipse使用它自己的编译器,因此您应该尝试在Eclipse中进行干净重建以查看它是否正常工作。我认为不会。
答案 2 :(得分:2)
我想我知道这里发生了什么。注释的实例实际上是具有唯一静态初始化器的接口。注释规范唯一添加的东西是语法糖和方法,类或字段的链接。因此,当您键入value=c.A
时,几乎就像在注释中添加静态启动器一样。注释不是A的子类,因此拒绝访问。受保护的访问包括包访问,因此当您将A移动到与B相同的包中时,注释也与A在同一个包中。它可以访问。非常好的问题,我认为两个编译器的行为应该相同。我认为Eclipse会让你自定义它所处理的错误,这样你就可以让他们同意使用不受欢迎的,更具限制性的行为。
答案 3 :(得分:1)
只有当A
和B
属于同一个软件包时,才会编译此代码。