gpt4 book ai didi

Java noob 需要澄清奇怪的重载方法问题

转载 作者:行者123 更新时间:2023-12-04 06:11:46 26 4
gpt4 key购买 nike

在我的真实代码中,我有一个对象池,它创建了我完全忘记的“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() 的父类版本被调用过。酒吧的版本从来没有。我试图找到有关为什么会发生这种情况的信息,但运气不佳。

谁能解释这个现象?此外,欢迎建议的解决方法/设计更改。谢谢。

最佳答案

我很确定问题出在“假设它以监听器的方式被调用”。现在,没有什么会导致 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 noob 需要澄清奇怪的重载方法问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690869/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com