4

此代码有效吗?

public abstract class A {
   protected static final String c = "my const";
}

@myAnnotation(value=A.c)
public class B extends A {

}

EclipseJDK 1.6.0.23 接受这一点,但MavenJDK 1.6.0.23 的 2.2.1 向我显示以下编译错误:

c 在 A 中具有受保护的访问权限

4

4 回答 4

3

感谢@adranale 的评论,我在访问控制的 Java 语言规范部分找到了不同的答案。我认为它不应该以这种方式工作,但有关“受保护”的相关文本显示

令 C 为声明受保护成员 m 的类。只有在 C 的子类 S 的主体内才允许访问。

类的主体是大括号中的所有代码。类注释在大括号之外,因此它们无权访问。有趣的是,这种逻辑不适用于类体内的方法、参数、字段或局部变量注释。

于 2012-05-31T00:06:47.417 回答
2

您尝试用“const”填充的注释尝试通过使用无法工作的受保护从外部访问类。Eclipse 使用它自己的编译器,因此您应该尝试在 Eclipse 中进行干净的重建以查看它是否正常工作。我认为不会。

于 2012-05-30T10:18:44.857 回答
2

我想我明白这里发生了什么。注释的实例实际上是具有唯一静态初始化程序的接口。注释规范在顶部添加的唯一内容是语法糖和指向方法、类或字段的链接。因此,当您键入时value=c.A,几乎就像在注释中添加静态初始化程序一样。注释不是 A 的子类,因此拒绝访问。受保护的访问包括包访问,因此当您将 A 移动到与 B 相同的包中时,注释也与 A 在同一个包中。它可以访问。非常好的问题,我认为两个编译器的行为应该是相同的。我认为 Eclipse 将允许您自定义将其视为错误的内容,以便您可以让他们同意两者都使用不受欢迎的、更具限制性的行为。

于 2012-05-30T12:13:46.527 回答
1

A只有当两者都B属于同一个包时,此代码才会编译。

于 2012-05-30T10:30:46.460 回答