如何从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; 
    } 
} 

实施例的客户端代码(这是:

延伸BaseAPI
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 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); 
    } 
} 

任何想法?这有意义吗?

+0

编译器消息只是一个警告。暂时忽略它。 – EJP 2012-03-19 04:05:17

在我看来,你似乎有相互竞争的目标,而解决办法是简单地把这个烂摊子移到其他地方。

怎么样实现的中间类型隐藏界面,像StringCallback:

interface ObjCallback extends Callback<Object> 

然后ClientView将执行下列操作之一:更滥

interface StringCallback extends Callback<String> 

或者,你可以只用一个对象屏蔽它接口,在一天结束的时候,您的基础API应该会很开心,并且您的客户端代码不必携带泛型。

我不完全确定你为什么要这样做,你的客户端代码应该只指定类型。

+0

老实说,我只是想通过无需返回并更改客户端代码来节省一些时间。我的项目时间很紧。 – LowDev1 2012-03-19 04:27:06

+1

我从OP的描述中推断出当前客户端代码只使用一个接口名称,并且他不想更改现有引用?怎么样:接口OrigCallback扩展回调;这应该保持客户端代码不被修改。 – hopia 2012-03-19 04:48:24