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

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

嗯。因此,我尝试使用observer模式为应用程序设置GUI。以标准方式;如果一个可观察对象更新,它将调用其所有观察者的更新方法,并传递一个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();
}
 @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)