Java继承-尝试使用泛型方法从Guava EventBus库获取总线

Java继承-尝试使用泛型方法从Guava EventBus库获取总线,java,inheritance,Java,Inheritance,接下来,我尝试创建一个库,从Guava EventBus库创建EventBus或AsyncEventBus 因此,我尝试创建一个类来扩展Guava的AsyncEventBusClass,因此我创建了RetroAsyncEventBus,如下所示: public class RetroAsyncEventBus extends AsyncEventBus{ private AsyncEventBus asyncEventBus; public RetroAsyncEventBu

接下来,我尝试创建一个库,从Guava EventBus库创建
EventBus
AsyncEventBus

因此,我尝试创建一个类来扩展Guava的
AsyncEventBusClass
,因此我创建了
RetroAsyncEventBus
,如下所示:

public class RetroAsyncEventBus extends AsyncEventBus{

    private AsyncEventBus asyncEventBus;

    public RetroAsyncEventBus(Executor executor) {
        super(executor);
    }

    @Override
    public void register(Object object) {
        super.register(object);
    }

    @Override
    public void unregister(Object object) {
        super.unregister(object);
    }
}
首先,我不明白为什么我必须
重写
注册
取消注册
,从继承的角度来看,我应该能够通过RetroAsyncEventBus对象访问这个超级方法,我的意思是我应该能够做到:

RetroAsyncEventBus retroAsyncEventBus = new RetroAsyncEventBus(executor);
retroAsyncEventBus.register(this);
但是我的IDE(netbeans)说我不能编译错误:
无法在
retroAsyncEventBus.register(这个)中找到符号
。所以我必须
覆盖
它们,我可以接受

然后我有了我的RetroBus类,我在其中创建并初始化了我想要的总线,采用
单例方法。像这样:

public class RetroBus {

    private final EventBus bus;
    private final AsyncEventBus asyncEventBusMainThread;
    private final AsyncEventBus asyncEventBus;
    private static RetroBus instance;

    private RetroBus(){
        bus = new EventBus();
        asyncEventBusMainThread = new AsyncEventBus(new EventQueueExecutor());
        asyncEventBus = new AsyncEventBus(Executors.newCachedThreadPool());
    }

    public synchronized static EventBus getDefaultBus()
    {
        if (instance == null) 
        {
            instance = new RetroBus();
            return instance.getDefaultEventBus();
        }
        return instance.getDefaultEventBus();
    }

    public synchronized static AsyncEventBus getAsyncBus()
    {
        if(instance == null)
        {
            instance = new RetroBus();
            return instance.getAsyncEventBus();
        }
        return instance.getAsyncEventBus();
    }

    public synchronized static AsyncEventBus getAsyncBusToMainThread()
    {
        if(instance == null)
        {
            instance = new RetroBus();
            return instance.getAsyncEventBusMainThread();
        }
        return instance.getAsyncEventBusMainThread();
    }

    private EventBus getDefaultEventBus() {
        return this.bus;
    }

    private AsyncEventBus getAsyncEventBus() {
        return this.asyncEventBus;
    }

    private AsyncEventBus getAsyncEventBusMainThread() {
        return this.asyncEventBusMainThread;
    }
}
现在我的库编译得很好。在要测试的项目中,我导入我的库,然后尝试执行以下操作:

public class TestClass {

    private RetroAsyncEventBus retroAsyncEventBus;

        public TestClass() {

            retroAsyncEventBus =  (RetroAsyncEventBus) RetroBus.getAsyncBusToMainThread();
            retroAsyncEventBus.register(this);
        }
}
这就是我真正的问题所在。首先,它迫使我强制转换
RetroBus.getAsyncBusToMainThread()RetroAsyncEventBus
扩展了
AsyncEventBus
所以它们应该是相同的类型时,我必须强制转换它,对吗

然后,如果像我那样强制转换它,我会得到以下编译错误:
getAsyncBusToMainThread()的类型;错误。


有人能解释一下我做错了什么吗?

您必须强制转换的原因是您的方法返回了
AsyncEventBus
而不是
RetroAsyncEventBus
。这意味着程序必须处理方法返回的任何可能的
AsyncEventBus
对象

更改返回类型,您将不再需要强制转换