我遇到了一个非常奇怪的问题和一个奇怪的解决方案:
class Parent {
protected void aProtectedMethod() { doSomething(); }
}
class Child extends Parent {
void anotherMethod() {
new SomeInterface() {
public void interfaceMethod() {
aProtectedMethod();
}
};
}
}
当运行child.anotherMethod()时,我在myProtectedMethod()处得到了IllegalAccessException,说我的内部类没有访问Parent类的权限......
但是,如果我添加:
protected void aProtectedMethod() { super.aProtectedMethod(); }
在我的Child课程中,一切都很好......
我想知道为什么会这样?
答案 0 :(得分:1)
答案 1 :(得分:0)
在某种程度上,这是有道理的。 Parent中可以访问Parent中的受保护方法,以及Parent子类的任何内容。内部类可以访问其包含类中的任何内容,而Parent中的受保护方法在技术上不是。所以,直到你向Child添加一个受保护的方法,然后才调用Parent的方法。
(嗯,我真的不确定我的解释是否比原始代码更清晰。抱歉。:))
答案 2 :(得分:0)
我不确定我理解你的问题。这段代码执行得很好:
interface SomeInterface {
public void interfaceMethod();
}
class Parent {
private void doSomething() { System.out.println("hello world"); }
protected void aProtectedMethod() { doSomething(); }
}
class Child extends Parent {
public static void main(String... args) {
new Child().anotherMethod();
}
void anotherMethod() {
new SomeInterface() {
public void interfaceMethod() {
aProtectedMethod(); // line A
}
}.interfaceMethod();
}
}
(按预期打印hello world
。)
但是,令人困惑的是,在A行(参见上面的代码),this
引用实际上是指类型为SomeInterface
的对象的实例,而不是{{1}这可以解释为什么你在调用Child
时遇到问题。您可以通过编写aProtectedMethod
来访问Child
的引用。
关于IllegalAccessException的文档:
当应用程序尝试反射创建实例(数组除外),设置或获取字段或调用方法时,抛出IllegalAccessException,但当前正在执行的方法无法访问指定类的定义,字段,方法或构造函数。
您使用的是反射API吗?
答案 3 :(得分:0)
我试过了,它在普通的java(不是GWT编译)中为我工作。
它可能是GWT编译器中的错误(或功能)。
您可以尝试显式调用此方法:
Child.this.aProtectedMethod();