簡體   English   中英

Java:方法簽名中類型的子類

[英]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 ExceptionConsoleDrawer.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM