Java 抽象 class 具有实现其自己的泛型参数的泛型参数
Java abstract class with generic parameter that implements its own generic parameter
我遇到了一个棘手的问题。
我正在尝试创建一个回调管理器泛型 class,它采用任何类型接口的泛型。计划是,做这样的事情:
public interface LocationListener {
void locationChanged();
void providerChanged();
}
//The implementation declaration below is wrong...
public abstract class CallbackManager<T> implements T {
//do something
}
public class MyCallbackManager extends CallbackManager<LocationListener> {
@Override
public void locationChanged() {
}
@Override
public void providerChanged() {
}
}
一般来说,我尽量避免像这样构建 MyCallbackManager class:
public class MyCallbackManager extends CallbackManager<LocationListener> implements LocationListener {
@Override
public void locationChanged() {
}
@Override
public void providerChanged() {
}
}
有办法实现吗?
期待您的回复。
编辑
因为您要求澄清用例。这是其背后的想法:
public abstract class CallbackManager<T> {
protected interface FunctionalInterface<T> {
void run(T type);
}
protected ArrayList<WeakReference<T>> eventQueue = new ArrayList<>();
protected void flush(@NonNull FunctionalInterface<T> functionalInterface) {
for (int i = eventQueue.size() - 1; i >= 0; i--) {
WeakReference<T> weakReference = eventQueue.get(i);
T type = weakReference.get();
if (type == null) {
unregister(i);
} else {
functionalInterface.run(type);
}
}
}
}
public class CallbackManagerLocation extends CallbackManager<LocationListener> implements LocationListener {
@Override
public void locationChanged() {
flush((ll) -> ll.locationChanged());
}
@Override
public void providerChanged() {
flush((ll) -> ll.providerChanged());
}
}
CallbackManagerLocation 中实现的接口仅用于具有与 CallbackManager 中保留的接口完全相同的命名约定。
抱歉,这是不允许的。由此产生的问题数量将是巨大的。例如,假设您在 CallbackManager 中有一个函数 public T locationChanged()
。这会违反接口,但在 CallbackManager class 中并不明显。还有更多这样的例子。
不,你不能那样做,
public abstract class CallbackManager<T> implements T
它将抛出编译时错误,因为 class T 没有根据 [=23] 中提供的 class 加载机制描述由抽象 class 实现的实际引用类型=] 文档
还有另一种方法,您可以按照以下方法进行操作,
public abstract class CallbackManager<ParentListener> implements ParentListener
.
但您会收到类似 Cannot refer to the type parameter LocationListener as a supertype
的错误消息
并且在任何情况下都不需要它,如果存在,则有其他方法可以回答
我遇到了一个棘手的问题。 我正在尝试创建一个回调管理器泛型 class,它采用任何类型接口的泛型。计划是,做这样的事情:
public interface LocationListener {
void locationChanged();
void providerChanged();
}
//The implementation declaration below is wrong...
public abstract class CallbackManager<T> implements T {
//do something
}
public class MyCallbackManager extends CallbackManager<LocationListener> {
@Override
public void locationChanged() {
}
@Override
public void providerChanged() {
}
}
一般来说,我尽量避免像这样构建 MyCallbackManager class:
public class MyCallbackManager extends CallbackManager<LocationListener> implements LocationListener {
@Override
public void locationChanged() {
}
@Override
public void providerChanged() {
}
}
有办法实现吗? 期待您的回复。
编辑
因为您要求澄清用例。这是其背后的想法:
public abstract class CallbackManager<T> {
protected interface FunctionalInterface<T> {
void run(T type);
}
protected ArrayList<WeakReference<T>> eventQueue = new ArrayList<>();
protected void flush(@NonNull FunctionalInterface<T> functionalInterface) {
for (int i = eventQueue.size() - 1; i >= 0; i--) {
WeakReference<T> weakReference = eventQueue.get(i);
T type = weakReference.get();
if (type == null) {
unregister(i);
} else {
functionalInterface.run(type);
}
}
}
}
public class CallbackManagerLocation extends CallbackManager<LocationListener> implements LocationListener {
@Override
public void locationChanged() {
flush((ll) -> ll.locationChanged());
}
@Override
public void providerChanged() {
flush((ll) -> ll.providerChanged());
}
}
CallbackManagerLocation 中实现的接口仅用于具有与 CallbackManager 中保留的接口完全相同的命名约定。
抱歉,这是不允许的。由此产生的问题数量将是巨大的。例如,假设您在 CallbackManager 中有一个函数 public T locationChanged()
。这会违反接口,但在 CallbackManager class 中并不明显。还有更多这样的例子。
不,你不能那样做,
public abstract class CallbackManager<T> implements T
它将抛出编译时错误,因为 class T 没有根据 [=23] 中提供的 class 加载机制描述由抽象 class 实现的实际引用类型=] 文档
还有另一种方法,您可以按照以下方法进行操作,
public abstract class CallbackManager<ParentListener> implements ParentListener
.
但您会收到类似 Cannot refer to the type parameter LocationListener as a supertype
的错误消息
并且在任何情况下都不需要它,如果存在,则有其他方法可以回答