2010-07-14 81 views
2

實現接口時,我怎樣才能實現ContactService接口沒有得到警告有關從編譯器選中轉換避免編譯器警告:有界的返回類型

interface ContactsService 
{ 
    <T extends Response> T execute(Action<T> action); 
} 

interface Action<T extends Response> { } 

interface Response{ } 

class GetDetailsResponse implements Response {} 

如果我回到GetDetailsResponse的實例,然後我得到的警告: 未選中壓倒一切的:返回類型選中需要轉換

這是在谷歌IO GWT的最佳實踐演示的例子。

+0

接口名稱後缺少''是一個錯字? – 2010-07-14 09:55:06

+0

固定缺失T – Shanta 2010-07-14 09:56:46

+1

'Action 'class/interface的簽名是什麼?向我們展示一個編譯器警告的例子。 – 2010-07-14 10:39:28

回答

2

我猜你想是這樣:

class MyService implements ContactsService { 
    @Override 
    public <T extends Response> T execute(Action<T> action) { 
     return (T)new GetDetailsResponse(); 
    } 
} 

這樣做的問題是,我可能有另一個類MyResponse實現響應。然後,我可以打電話:

Action<MyResponse> action = new Action<MyResponse>(); 
// you can't actually instantiate an interface, just an example 
// the action should be some instance of a class implementing Action<MyResponse> 
MyReponse r = myService.execute(action); 

但execute方法返回GetDetailsResponse的實例,這與MyReponse不兼容。您需要返回類型T,該類型由您傳遞執行的操作給出。

據我可以告訴你不能在執行內部實例化類型T的新變量(不是沒有一些未經檢查的強制轉換)。您可能需要動作類來爲您提供一個可以從execute返回的Response實例。事情是這樣的:

interface Response { 
    void setWhatever(String value); 
} 

interface Action<T extends Response> { 
    T getResponse(); 
} 

class MyAction implements Action<GetDetailsResponse> { 
    @Override 
    public GetDetailsResponse getResponse() { 
     return new GetDetailsResponse(); 
    } 
} 

class MyService implements ContactsService { 
    @Override 
    public <T extends Response> T execute(Action<T> action) { 
     T response = action.getResponse(); 
     // do something to Response here like 
     response.setWhatever("some value"); 
     return response; 
    } 
} 
+0

在提問者缺席的情況下,我不得不對此提出贊同,並認爲這是發生了什麼事情。總之,你不能有一個通用的返回類型,並且返回非泛型的東西! – 2010-07-14 13:39:28

1

要實現ContactsService,你必須能夠處理任何種Response。用戶可能會向您傳遞Action<FooResponse>,並期望返回FooResponse,或者可能會給Action<BarResponse>並希望BarResponse。如果你無法做到這一點,那麼你不符合接口要求。

如果接口想要接受只支持一種類型的實現,那麼它本身就會在<T extends Response>上生成基因,而不僅僅是它的方法。