Java: подкласс типа в сигнатуре метода - PullRequest
3 голосов
/ 09 декабря 2010

Хорошо. Поэтому я пытаюсь настроить графический интерфейс для приложения, используя шаблон наблюдателя. Стандартным способом; если 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 передаваемый параметр 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.

Потому что подпись метода не совпадает. Кажется, я не могу обойти эту проблему, не имея отдельных классов-наблюдателей для каждого типа компонента. Можно ли решить эту проблему с помощью обобщений? Любая помощь будет оценена.

Ответы [ 3 ]

2 голосов
/ 09 декабря 2010

Ваш интерфейс должен объявить, что это throws Exception, чтобы решить вашу ошибку компилятора. Причина в том, что вы не передаете тип класса, вы передаете интерфейс Observer. Таким образом, если один класс, который реализует Observable, генерирует исключение, вызывающий класс не будет знать об этом, пока интерфейс не определит его.

0 голосов
/ 09 декабря 2010

В вашем Observer интерфейсе ваш update() метод не throw Exception, а ваш ConsoleDrawer.update(). 2 не совпадают в соответствии с Java.

Либо вы удалите throw Exception на ConsoleDrawer, либо добавите исключение на интерфейсе Observer.

0 голосов
/ 09 декабря 2010

В общем случае Java позволяет ослабить возвращаемое значение при переопределении метода или усилить параметры. Однако в этом случае вы пытаетесь ослабить параметр.

Может быть, дженерики могут помочь. Я должен признать, что я не пробовал код ниже, это только из памяти:

Вы можете попробовать использовать дженерики в сигнатуре интерфейса Observer:

public interface Observer<T>

или

public interface Observer<T extends ComponentUpdateEvent>

Кроме того, я бы пересмотрел сигнатуру интерфейса Observable.

public void addObserver(Observer<T extends ComponentUpdateEvent> observer)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...