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

具有泛型参数的Java抽象类,该泛型参数实现自己的泛型参数,java,class,generics,interface,abstract,Java,Class,Generics,Interface,Abstract,我面临一个棘手的问题。 我正在尝试创建一个回调管理器泛型类,它接受任何类型接口的泛型。计划是这样做: public interface LocationListener { void locationChanged(); void providerChanged(); } //The implementation declaration below is wrong... public abstract class CallbackManager<T> implem

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

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() {

   }
}
public class MyCallbackManager extends CallbackManager<LocationListener> implements LocationListener {

   @Override
   public void locationChanged() {

   } 

   @Override
   public void providerChanged() {

   }
}
公共接口位置侦听器{
无效位置已更改();
void providerChanged();
}
//下面的实现声明是错误的。。。
公共抽象类CallbackManager实现了{
//做点什么
}
公共类MyCallbackManager扩展了CallbackManager{
@凌驾
公共无效位置已更改(){
} 
@凌驾
公共无效提供程序已更改(){
}
}
一般来说,我尽量避免像这样构建MyCallbackManager类:

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() {

   }
}
public class MyCallbackManager extends CallbackManager<LocationListener> implements LocationListener {

   @Override
   public void locationChanged() {

   } 

   @Override
   public void providerChanged() {

   }
}
公共类MyCallbackManager扩展CallbackManager实现LocationListener{
@凌驾
公共无效位置已更改(){
} 
@凌驾
公共无效提供程序已更改(){
}
}
有没有办法做到这一点? 我期待着你的回复

编辑

因为您要求对用例进行澄清。这就是它背后的理念:

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());
   }
} 

公共抽象类回调管理器{
保护接口功能接口{
无效运行(T型);
}
受保护的ArrayList eventQueue=新ArrayList();
受保护的无效刷新(@NonNull functioninterface functioninterface){
对于(int i=eventQueue.size()-1;i>=0;i--){
WeakReference WeakReference=eventQueue.get(i);
T type=weakReference.get();
if(type==null){
注销(i);
}否则{
FunctionInterface.run(类型);
}
}
}
}
公共类CallbackManager位置扩展CallbackManager实现LocationListener{
@凌驾
公共无效位置已更改(){
刷新((ll)->ll.locationChanged());
} 
@凌驾
公共无效提供程序已更改(){
刷新((ll)->ll.providerChanged());
}
} 

CallbackManager位置中实现的接口仅用于具有与CallbackManager中保留的接口完全相同的命名约定。

抱歉,但这是不允许的。由此产生的问题数量将是巨大的。例如,假设您在CallbackManager中有一个函数
public T locationChanged()
。这将违反接口,但在CallbackManager类中并不明显。还有更多这样的例子。

不,你不能那样做


公共抽象类CallbackManager实现T

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

还有另一种方法,你可以按照下面的方法做,
公共抽象类CallbackManager实现ParentListener

但是您将得到错误消息,如
无法将类型参数LocationListener引用为超类型

而且在任何情况下都不需要它,如果存在的话,它的答案有另一种方式

公共抽象类CallbackManager实现T{
”不,您不能这样做。您使用类型参数做什么?正如您所发现的,
类CallbackManager实现t
是不可能的。但是什么样的方法会有
CallbackManager
?您确定需要超类吗?更改类型参数不会导致类需要不同的方法。这是胡说八道。您完了我认为如果您解释
CallbackManager
中需要继承的行为,以及它与
T
@findul的关系,我们可能会更好地帮助您。是的,我知道了。我编辑了我的问题。正如您所看到的,我没有在CallbackManager中调用接口的方法。CallbackManager只保留接口的引用。调用在扩展CallbackManager的类中完成(例如CallbackManagerLocation)。