我正在研究需要對不同的自定義事件和偵聽器作出反應的程序。Java中的通用addListener
我想盡量縮短使用泛型,事實是,我不明白我的錯誤在哪裏。
這裏我的代碼:
的聽衆和事件:
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