Java 如何对回调接口的实现类隐藏泛型类型参数
我正在Android上编写一个API,该API将由现有应用程序使用,我将调用客户端。有很多客户端代码,我真的不想修改它。现在API实现了一个回调方法作为接口。为了避免编写大量锅炉板代码,我决定使用泛型和可扩展类。这个设计决策使我的API的回调接口使用泛型。反过来,这会导致编译器将客户端标记为需要指定实现回调的类型参数。我不想让客户端不得不使用类型参数。实际上,我希望屏蔽客户端代码,使其不必指定类型,并希望防止客户端指定错误的类型 以下是一个例子: 封装基本功能的可扩展API类示例:Java 如何对回调接口的实现类隐藏泛型类型参数,java,android,Java,Android,我正在Android上编写一个API,该API将由现有应用程序使用,我将调用客户端。有很多客户端代码,我真的不想修改它。现在API实现了一个回调方法作为接口。为了避免编写大量锅炉板代码,我决定使用泛型和可扩展类。这个设计决策使我的API的回调接口使用泛型。反过来,这会导致编译器将客户端标记为需要指定实现回调的类型参数。我不想让客户端不得不使用类型参数。实际上,我希望屏蔽客户端代码,使其不必指定类型,并希望防止客户端指定错误的类型 以下是一个例子: 封装基本功能的可扩展API类示例: public
public 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类ClientView扩展活动实现回调{
文本视图mTextView;
onCreate(){
//假设这里有正常的设置代码
新示例API(this.doSomething();
}
onCallback(字符串响应){
mTextView.setText(响应);
}
}
有什么想法吗?这有意义吗?在我看来,你似乎有着相互竞争的目标,而解决办法就是将混乱转移到其他地方 如何实现中间类型隐藏接口,如StringCallback:
interface StringCallback extends Callback<String>
接口StringCallback扩展了回调
或者更粗暴地说,你可以用一个物体遮住它:
interface ObjCallback extends Callback<Object>
接口ObjCallback扩展回调
然后ClientView将实现这些接口中的一个,最终您的基本API人员应该会感到高兴,并且您的客户机代码不必携带泛型
我不完全确定您为什么要这样做,您的客户机代码应该只指定类型 编译器消息只是一个警告。暂时忽略它。老实说,我只是想通过不必回去更改客户端代码来节省一些时间。我的项目在一个非常紧迫的截止日期。我从OP的描述推断,当前的客户端代码只使用一个接口名称,他不想更改现有的引用?这个如何:接口OrigCallback扩展回调;这应该保持客户端代码不被修改。
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);
}
}
interface StringCallback extends Callback<String>
interface ObjCallback extends Callback<Object>