Java 抽象类,具有实现自己的泛型参数的泛型参数



我面临着一个棘手的问题。我正在尝试创建一个回调管理器泛型类,该类采用任何类型的接口的泛型。计划是,做这样的事情:

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类:

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 类中很明显。还有更多这样的例子。

不,你不能那样做,

public abstract class CallbackManager<T> implements T

它将抛出编译时错误,因为类 T 没有根据 JAVA 文档中提供的类加载机制描述抽象类实现的实际引用类型。

还有另一种方法,因此您可以执行以下操作, public abstract class CallbackManager<ParentListener> implements ParentListener .

但是您会收到类似Cannot refer to the type parameter LocationListener as a supertype的错误消息并且在任何情况下都不需要它,如果存在,则有替代方法可以回答

最新更新