Я работаю над программой, которая должна реагировать на различные пользовательские события и прослушиватели.Generic addListener в Java
Я пытаюсь сделать его коротким с помощью дженериков, факт в том, что я не понимаю, где моя ошибка.
Вот мой код:
слушателей и событие:
public interface MyFirstListener extends EventListener {
void firstRequest(String text);
}
public interface MySecondListener extends EventListener {
void secondRequest(String text);
}
public class MyEvent extends EventObject {
private String text = null;
public MyEvent(Object source, String text) {
super(source);
this.text = text;
}
public String getText() {
return text;
}
}
А вот хитрый код:
public class MyProblem {
private EventListenerList listenerList = new EventListenerList();
public MyProblem() {}
public <T extends EventListener> void addListener(T listener) {
listenerList.add(T.class, listener); // Here I have : Illegal class literal for the type parameter T
}
public <T extends EventListener> void removeListener(T listener) {
listenerList.remove(T.class, listener); // Here I have : Illegal class literal for the type parameter T
}
void fireFirstRequestEvent(MyEvent evt) {
for (MyFirstListener listener : listenerList.getListeners(MyFirstListener.class)) {
listener.firstRequest(evt.getText());
}
}
void fireSecondRequestEvent(MyEvent evt) {
for (MySecondListener listener : listenerList.getListeners(MySecondListener.class)) {
listener.secondRequest(evt.getText());
}
}
public static void main(String[] args) {
FirstClass first = new FirstClass();
SecondClass second = new SecondClass();
MyProblem problem = new MyProblem();
problem.addListener(first);
problem.addListener(second);
}
}
class FirstClass implements MyFirstListener {
@Override
public void firstRequest(String text) {
// Do Something
}
}
class SecondClass implements MySecondListener {
@Override
public void secondRequest(String text) {
// Do Something
}
}
Проблема заключается в методах addListeners и removeListeners, у меня есть эта ошибка: Недопустимый литерал класса для параметра типа T Я не понимаю, как его поймать.
Я стараюсь также этот код:
listenerList.add(listener.getClass(), listener); // Here I have : The method add(Class<T>, T) in the type EventListenerList is not applicable for the arguments (Class<capture#1-of ? extends EventListener>, T)
я попробовать другие вещи без результата, и я не нахожу решения, которые соответствуют мой код.
У кого-нибудь есть решение или оно неразрешимо? Моя цель - иметь более короткий код и даже красиво.
Спасибо-х
[Тип стирания] (http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens) предотвращает использование 'T.class' во время выполнения. –
Как выглядит ваш 'EventListenerList' (особенно методы добавления и удаления)? – Calculator
@Calculator Вероятно, это выглядит как [javax.swing.event.EventListenerList] (http://docs.oracle.com/javase/8/docs/api/javax/swing/event/EventListenerList.html). – VGR