gpt4 book ai didi

java - Java 中的通用 addListener

转载 作者:行者123 更新时间:2023-11-30 02:38:36 28 4
gpt4 key购买 nike

我正在开发一个需要对不同的自定义事件和监听器使用react的程序。

我试图使用泛型来缩短它,事实是,我不明白我的错误在哪里。

这是我的代码:

听众和事件:

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 中,我有这个错误: Illegal class literal for the type parameter 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)

我尝试了其他一些没有结果的事情,但没有找到任何与我的代码匹配的解决方案。

任何人有任何解决方案或无法解决?
我的目标是让代码更短,甚至更漂亮。

谢谢

最佳答案

通常,您只需为每个监听器类型声明两种方法:

public void addFirstListener(MyFirstListener listener) {
listenerList.add(MyFirstListener.class, listener);
}

public void removeFirstListener(MyFirstListener listener) {
listenerList.remove(MyFirstListener.class, listener);
}

如果您希望能够动态添加和删除监听器,则必须查找应按其运行时类型添加/删除的监听器的类型。

例如,创建支持的监听器类型列表。在您的示例中,有两种类型 MyFirstListener.classMySecondListener.class :
private final static List<Class<? extends EventListener>> SUPPORTED_LISTENER_TYPES 
= Arrays.asList(MyFirstListener.class, MySecondListener.class);

然后,您将需要一个能够为给定监听器查找相应监听器类型的方法:
private Class<? extends EventListener> getListenerType(EventListener listener){
for(Class<? extends EventListener> listenerType : SUPPORTED_LISTENER_TYPES){
if(listenerType.isAssignableFrom(listener.getClass())){
return listenerType;
}
}
return null;
}

现在,您可以在 addListener 中使用此方法和 removeListener方法:
@SuppressWarnings("unchecked")
public void addListener(EventListener listener) {
if(listener == null){
return;
}
Class<? extends EventListener> listenerType = getListenerType(listener);
if(listenerType == null){
throw new IllegalArgumentException("Listener " + listener + " not supported");
}
listenerList.add((Class<EventListener>)getListenerType(listener), listener);
}

此处未经检查的强制转换是安全的,因为给定的 listener保证是 getListenerType() 返回的类型的后代.

关于java - Java 中的通用 addListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42397867/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com