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