私は、さまざまなカスタムイベントとリスナーに反応する必要のあるプログラムを開発中です。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の無効なクラスリテラル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'はどのように見えますか(特にaddメソッドとremoveメソッド)? – Calculator
@ Calculatorおそらく[javax.swing.event.EventListenerList](http://docs.oracle.com/javase/8/docs/api/javax/swing/event/EventListenerList.html)のように見えます。 – VGR