gpt4 book ai didi

Java 集合通过可重写变量提供类型

转载 作者:行者123 更新时间:2023-12-01 22:53:48 24 4
gpt4 key购买 nike

示例代码:

public abstract class AbstractEvent
{
// extended by AbstractEvent subclasses, used as a lambda function interface
// (all sub-interfaces define one method)
public interface EventListener
{
}
// assigned by subclasses in a static block
protected static Class<? extends EventListener> listenerClass;
// this line obviously does not work
protected static Set<listenerClass> listeners = new HashSet<>();

public final boolean addListener(listenerClass listener)
{
return listeners.add(listener);
}

public final boolean removeListener(listenerClass listener)
{
return listeners.remove(listener);
}
}

这样的事情在 Java 中是否可能实现?如果可以,如何实现?我在 Scala 中通过在抽象类中定义一个没有主体的类型并在子类中定义它来实现它(并且效果很好),但我也想在 Java 中实现它。

这样做的重点是我想避免在 AbstractEvent 的所有子类中重复设置代码。

最佳答案

您可以使用泛型来完成此操作:

public abstract class AbstractEvent<T extends EventListener>
{
public interface EventListener
{
}

protected static Set<T> listeners = new HashSet<T>();

public final boolean addListener(T listener)
{
return listeners.add(listener);
}

public final boolean removeListener(T listener)
{
return listeners.remove(listener);
}
}

编辑1:为了避免为每个接口(interface)创建单独的文件,您可以使用以下代码:

public static void main(String[] args)
{
EventListener anEventListener = new EventListener() {
// Any methods that you override for EventListener go in here
};

SomeEvent evt = new SomeEvent();

// You can even pass an anonymous one as a parameter.
evt.addListener(new EventListener() {
});
}

您还可以执行以下操作:

public class SomeClass
{
// This event listener is a private member of a class
private EventListener mEventListener = new EventListener() {
// Any methods that you override for EventListener go in here
};
}

关于Java 集合通过可重写变量提供类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24374029/

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