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