2012-03-19 101 views
0

我正在編寫一個將由現有應用程序使用的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

回答

1

在我看來,你似乎有相互競爭的目標,而解決辦法是簡單地把這個爛攤子移到其他地方。

怎麼樣實現的中間類型隱藏界面,像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

相關問題