gpt4 book ai didi

java - 实现通用接口(interface)的类的子类

转载 作者:搜寻专家 更新时间:2023-10-31 19:31:28 26 4
gpt4 key购买 nike

我正在使用 Google Web Toolkit,但在实现通用接口(interface)时遇到了问题。我对泛型不是很熟悉,在这里对别人的代码进行升级。

这就是我想要做的:我想要一个执行一些日志记录的通用回调接口(interface)的实现,然后将该实现子类化以处理特定的回调场景。

界面是这样的:

public interface AsyncCallback<T> {
void MethodFromAsyncCallback(T result);
}

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

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
}
}

需要触发回调

public interface MyServiceAsync {
public void DoSomeThing(AsyncCallback<Integer>);
}

然后所有这些都汇集在一个看起来像这样的调用中:

MyServiceAsync myService = (MyServiceAsync)GWT.create(MyServiceAsync.class);
myService.DoSomeThing(new SpecificCallback());

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

GWT.create()实现我创建的接口(interface),它要求提供给 AsyncCallback 的类型已指定(匹配其他地方的类型,超出此问题的范围),因此生成 DoSomething(AsyncCallback<Integer>)一个整数而不是一个对象。这是我无法控制的。

它提示 DoSomething()需要 AsyncCallback<Integer> .我给它一些继承自 AsyncCallback<Object> 的东西.我想对于泛型,继承的概念会有些破损?

所以我的问题是:

要么我怎样才能把它混合在一起,这样DoSomething()会认识到 SpecificCallback符合要求,

我如何构建 CallbackBase 之间的关系?和 SpecificCallback这样可以避免重复代码,但是 SpecificCallback工具 AsyncCallback<Integer>直接?

谢谢。

最佳答案

我认为您需要做的是定义 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);
}
}

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

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

然后是你的DoSomething方法,它接受 AsyncCallback<Integer> , 将接受 SpecificCallback .

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

编辑

就其值(value)而言,我建议更改您的设计以使用组合而不是继承。在这种情况下,而不是使用抽象类 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);
}
}

关于java - 实现通用接口(interface)的类的子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2411239/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com