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)