在我的真实代码中,我有一个创建“Foo”的对象池,我完全忘记了。问题是我从来没有首先创建“酒吧”!直到你们中的一些人提到我在示例中执行“IExample Bar”时所犯的错误,我才意识到这一点。谢谢。
我对 Java 比较陌生,我试图理解为什么这不起作用。考虑以下(非常粗略的)示例:
interface IExample {
public void myOverriddenMethod();
public void myMethod();
}
class Foo implements IExample {
protected string myVar;
public void myMethod() {
SomeClass anotherclass = new SomeClass() {
// assume this gets called in a listener fashion
public void someMethod() {
myOverriddenMethod();
}
}
}
public void myOverriddenMethod(){
myVar = "Foo";
}
}
class Bar extends Foo implements IExample {
public void myOverriddenMethod(){
myVar = "Bar";
}
}
IExample bar = new Bar();
bar.myMethod(); // expect myVar to be equal to to "Bar", but it is equal to "Foo".
所以看起来只有父类版本的 myOverriddenMethod() 被调用过。 Bar 的版本从来没有。我试图查找有关为什么会发生这种情况的信息,但运气不佳。
谁能解释一下这个现象?此外,欢迎建议的解决方法/设计更改。谢谢。
最佳答案
我很确定问题出在“假设以监听器方式调用它”。现在,其中没有任何内容会导致 SomeClass.myMethod() 被调用,因此也没有任何内容会导致 myOverridenMethod() 被调用。下面的修改版(如果丑陋的话)工作正常;也许你应该发布你的实际代码?
interface IExample {
void myMethod();
void myOverriddenMethod();
}
interface SomeListener extends EventListener {
void someMethod();
}
class Foo implements IExample
{
private EventListenerList ll = new EventListenerList();
protected String myVar;
protected Foo() {
ll.add(SomeListener.class, new SomeListener()
{
@Override
public void someMethod()
{
myOverriddenMethod();
}
});
}
public void myMethod() {
for( SomeListener l : ll.getListeners(SomeListener.class) )
{
l.someMethod();
}
}
@Override
public void myOverriddenMethod()
{
myVar = "Foo";
}
}
class Bar extends Foo {
@Override
public void myOverriddenMethod()
{
myVar = "Bar";
}
public static void main(String[] args) {
IExample bar = new Bar();
bar.myMethod();
System.out.println(((Bar) bar).myVar);
}
}
关于Java 菜鸟需要澄清奇怪的重载方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690869/