다른 맞춤 이벤트와 리스너에 반응해야하는 프로그램을 만들고 있습니다.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'는 어떻게 보이나요 (특히 add와 remove 메소드)? – Calculator
@ Calculator 아마도 [javax.swing.event.EventListenerList] (http://docs.oracle.com/javase/8/docs/api/javax/swing/event/EventListenerList.html)와 유사합니다. – VGR