如何从Callback接口的实现类中隐藏泛型类型参数
问题描述:
我正在编写一个将由现有应用程序使用的Android API,我将称其为客户端。有很多客户端代码,我不想修改它。现在API实现一个回调方法作为接口。为了节省我自己编写大量的锅炉代码,我决定使用泛型和可扩展类。这个设计决定让我的API的回调接口使用泛型。反过来,这导致编译器将客户端标记为需要指定执行回调的类型参数。我不想让客户端必须使用类型参数。实际上,我想屏蔽客户端代码不必指定类型,并希望阻止客户端指定错误的类型。如何从Callback接口的实现类中隐藏泛型类型参数
下面是一个例子:
可扩展API类的实施例来封装基本的功能:
public class ExampleAPI extends BaseAPI<String> {
public ExampleAPI(Callback<String> callback) {
super(callback):
}
public String getResponse() {
String response = "blah";
return response;
}
}
实施例的客户端代码(这是:
延伸BaseAPIpublic abstract class BaseAPI<T> {
Callback mCallBack;
public BaseAPI(Callback<T> callback) {
mCallBack = callback;
}
public void doSomething() {
T response = getResponse();
if (mCallBack != null) {
mCallBack.onCallback(response)
}
}
public abstract T getResponse();
public interface Callback<T> {
public void onCallback(T response);
}
}
实施例类我希望它看起来如何):
public class ClientView extends Activity implements Callback {
TextView mTextView;
onCreate() {
//pretend normal setup code is here
new ExampleAPI(this).doSomething();
}
onCallback(String response) {
mTextView.setText(response);
}
}
例客户代码(这是编译希望它看起来):
public class ClientView extends Activity implements Callback<String> {
TextView mTextView;
onCreate() {
//pretend normal setup code is here
new ExampleAPI(this).doSomething();
}
onCallback(String response) {
mTextView.setText(response);
}
}
任何想法?这有意义吗?
答
在我看来,你似乎有相互竞争的目标,而解决办法是简单地把这个烂摊子移到其他地方。
怎么样实现的中间类型隐藏界面,像StringCallback:
interface ObjCallback extends Callback<Object>
然后ClientView将执行下列操作之一:更滥
interface StringCallback extends Callback<String>
或者,你可以只用一个对象屏蔽它接口,在一天结束的时候,您的基础API应该会很开心,并且您的客户端代码不必携带泛型。
我不完全确定你为什么要这样做,你的客户端代码应该只指定类型。
编译器消息只是一个警告。暂时忽略它。 – EJP 2012-03-19 04:05:17