Java继承-尝试使用泛型方法从Guava EventBus库获取总线
接下来,我尝试创建一个库,从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
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
对象
更改返回类型,您将不再需要强制转换