[英]Java: Subclass of the type in a method signature
好。 所以我正在嘗試使用觀察者模式為應用程序設置GUI。 以標准方式; 如果Observable更新它調用所有觀察者的update方法,傳遞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子類的update方法時,傳遞的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.
因為方法簽名不一樣。 如果沒有為每種類型的組件提供單獨的觀察者類,我似乎無法解決這個問題,是否有可能用泛型來解決這個問題? 任何幫助,將不勝感激。
您的接口必須聲明它throws Exception
來解決編譯器錯誤。 這樣做的原因是你沒有傳遞一個類類型,你傳遞了Observer接口。 因此,如果一個實現Observable的類拋出異常,則調用類將不知道它,除非接口指定它。
在Observer
接口中, update()
方法不會throw Exception
而ConsoleDrawer.update()
throw Exception
。 根據java,2不一樣。
您可以在ConsoleDrawer
上刪除throw Exception
,也可以在Observer
接口上添加異常。
通常,Java允許您在覆蓋方法時削弱返回的值,或者增強參數。 但是,在這種情況下,您試圖削弱參數。
也許仿制葯可以提供幫助。 我必須承認我沒有嘗試過下面的代碼,這只是來自內存:
您可以嘗試在Observer接口的簽名中使用泛型:
public interface Observer<T>
要么
public interface Observer<T extends ComponentUpdateEvent>
除此之外,我還修改了Observable接口的簽名。
public void addObserver(Observer<T extends ComponentUpdateEvent> observer)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.