gpt4 book ai didi

Java:方法签名中类型的子类

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:18:00 27 4
gpt4 key购买 nike

好的。所以我正在尝试使用观察者模式为应用程序设置 GUI。以标准方式;如果一个 Observable 更新,它调用所有观察者的更新方法,传递一个 ComponentUpdateEvent,如下所示:

public interface Observable {
ArrayList<Observer> observers = new ArrayList<Observer>();

public void updateObservers();

public void addObserver(Observer observer);

public void removeObserver(Observer observer);
}

public interface Observer {
public void update(ComponentUpdateEvent updateEvent);
}

public abstract class ComponentUpdateEvent {
public abstract ComponentType getComponentType();
}

我在应用程序的“模型”端有许多不同的组件,它们实现了 Observable。每种类型的组件都有一个 Drawer 类的单独子类,它实现了 Observer,用于呈现到 JPanel。

问题是我试图做到这样,当调用 Drawer 子类的更新方法时,传递的 updateEvent 参数可以是 ComponentUpdateEvent 的子类。

但是,显然,如果我尝试按如下方式执行此操作:

 @Override
public void update(ConsoleUpdateEvent updateEvent) throws Exception {
if (this.componentType != updateEvent.get)) {
throw new Exception("ComponentType Mismatch.");
}
else {
messages = updateEvent.getComponentState();
}
}

我得到编译器错误:

The method update(ConsoleUpdateEvent) of type ConsoleDrawer must override or implement a supertype method.

因为方法签名不一样。如果不为每种类型的组件提供单独的观察者类,我似乎无法解决这个问题,是否可以用泛型解决这个问题?任何帮助将不胜感激。

最佳答案

您的接口(interface)必须声明它throws Exception 以解决您的编译器错误。这样做的原因是您没有传递类类型,而是传递了 Observer 接口(interface)。因此,如果一个实现 Observable 的类抛出异常,调用类将不知道它,除非接口(interface)指定它。

关于Java:方法签名中类型的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4401496/

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