Java:方法签名中类型的子类
嗯。因此,我尝试使用observer模式为应用程序设置GUI。以标准方式;如果一个可观察对象更新,它将调用其所有观察者的更新方法,并传递一个ComponentUpdateEvent,如下所示:Java:方法签名中类型的子类,java,generics,subclass,observer-pattern,Java,Generics,Subclass,Observer Pattern,嗯。因此,我尝试使用observer模式为应用程序设置GUI。以标准方式;如果一个可观察对象更新,它将调用其所有观察者的更新方法,并传递一个ComponentUpdateEvent,如下所示: public interface Observable { ArrayList<Observer> observers = new ArrayList<Observer>(); public void updateObservers(); public void addO
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();
}
@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.
因为方法签名不同。如果没有为每种类型的组件提供单独的观察者类,我似乎无法回避这个问题,有可能用泛型解决这个问题吗?任何帮助都将不胜感激。一般来说,Java允许您在重写方法时削弱返回值,或加强参数。但是,在本例中,您试图削弱该参数 也许泛型药能帮上忙。我必须承认,我没有尝试过下面的代码,这只是记忆中的代码: 您可以尝试在Observer接口的签名中使用泛型:
public interface Observer<T>
公共接口观察者
或
公共接口观察者
除此之外,我还要修改可观察接口的签名
public void addObserver(Observer<T extends ComponentUpdateEvent> observer)
public void addObserver(观察者)
您的接口必须声明它抛出异常来解决编译器错误。这样做的原因是,您没有传递类类型,而是传递观察者接口。因此,如果实现Observable的一个类抛出异常,调用类将不知道它,除非接口指定它。在Observer
接口中,你的update()
方法不会抛出异常,而你的ConsoleDrawer.update()会抛出异常。根据java的说法,这两个是不一样的
要么删除控制台上的抛出异常
,要么在观察者
界面上添加异常。要么你对强化和弱化的定义与我的相反,要么你把第一句话倒过来了。重写方法的返回类型可以更具体(我称之为“更强”),而参数可以不那么具体(“较弱”)。它抛出的类型的行为类似于返回类型。
public void addObserver(Observer<T extends ComponentUpdateEvent> observer)