实现通用接口的类的子类

Ips*_*gle 5 java generics gwt inheritance

我正在使用Google Web Toolkit,我在实现通用接口方面遇到了问题.我不熟悉泛型,在这里对其他人的代码进行升级.

这就是我想要做的事情:我希望有一个通用回调接口的实现来执行一些日志记录,然后将该实现子类化以处理特定的回调场景.

界面是这样的:

public interface AsyncCallback<T> {
    void MethodFromAsyncCallback(T result);
}
Run Code Online (Sandbox Code Playgroud)

抽象和具体的实现看起来像这样:

class CallbackBase implements AsyncCallback<Object> {
    public abstract void doStuff(Object result);

    public void MethodFromAsyncCallback(Object result) {
        // IMPORTANT STUFF
        // here are things I would like to do for all callbacks, hence the superclass.

        // Then we do the subclass specific things.
        doStuff(result);
    }
}

class SpecificCallback extends CallbackBase
{
    public void doStuff(Object result) {
        Integer i = (Integer)result;
        // do stuff with i
    }
}
Run Code Online (Sandbox Code Playgroud)

回调需要从中触发

public interface MyServiceAsync {
    public void DoSomeThing(AsyncCallback<Integer>);
}
Run Code Online (Sandbox Code Playgroud)

然后它们在一个看起来像这样的调用中汇集在一起​​:

MyServiceAsync myService = (MyServiceAsync)GWT.create(MyServiceAsync.class);
myService.DoSomeThing(new SpecificCallback());
Run Code Online (Sandbox Code Playgroud)

这就是我们遇到问题的地方!

GWT.create()实现我创建的接口时,它要求AsyncCallback指定给定的类型(匹配其他地方的类型,超出了这个问题的范围),因此产生DoSomething(AsyncCallback<Integer>)一个Integer而不是一个Object.这超出了我的控制范围.

它抱怨说DoSomething()需要AsyncCallback<Integer>.我给它的东西继承了一些东西AsyncCallback<Object>.我想用泛型,继承的概念有点破碎?

所以我的问题是:

要么我怎么能将它们混合在一起以便DoSomething()能够认识到SpecificCallback满足它的要求,

或者我如何构建之间的关系CallbackBase,SpecificCallback以避免重复的代码,但直接SpecificCallback实现AsyncCallback<Integer>

谢谢.

Col*_*inD 10

我认为你需要做的是这样定义CallbackBase:

abstract class CallbackBase<T> implements AsyncCallback<T> {
  public abstract void doStuff(T result);

  public void MethodFromAsyncCallback(T result) {
    // general stuff (T is a subclass of Object)
    doStuff(result);
  }
}
Run Code Online (Sandbox Code Playgroud)

那么你希望你的特定回调是这样的:

class SpecificCallback extends CallbackBase<Integer> {
  public void doStuff(Integer result) {
    // no need to cast
    // do stuff with result
  }
}
Run Code Online (Sandbox Code Playgroud)

那么接受a的DoSomething方法AsyncCallback<Integer>将接受a SpecificCallback.

(迂腐旁注:请用Java中的小写字母开始所有方法)

编辑

对于它的价值,我建议改变你的设计使用组合而不是继承.在这种情况下,CallbackBase您可以使用具体的实现,而不是使用抽象类并扩展它,AsyncCallback<T>如下所示:

class GeneralCallbackWrapper<T> implements AsyncCallback<T> {
  private final AsyncCallback<? super T> delegate;

  public GeneralCallbackWrapper(AsyncCallback<? super T> delegate) {
    this.delegate = delegate;
  }

  public void MethodFromAsyncCallback(T result) {
    // general stuff here
    delegate.MethodFromAsyncCallback(result);
  }
}
Run Code Online (Sandbox Code Playgroud)