2015-02-06 104 views
0

我想爲我的基本服務編寫一個通用接口。這是我所嘗試的:如何在java接口中使用泛型的泛型

假設我們有一個請求和響應對象。每個請求類型都必須綁定到響應類型,所以我們可以處理響應類型的請求。

abstract class Response { 

}  

abstract class Request<R extends Response> { 

} 

現在讓我們寫一些關於他們的實現:

class DummyResponse extends Response { 

} 

class DummyRequest extends Request<DummyResponse> { 

} 

好了,我們有實現。讓我們深入到界面,我掙扎着:

interface MyService { 

    <R extends Response, T extends Request<R>> R getResponse(T request); 

} 

當我實現這個爲MyService,我有錯誤:

class MyServiceImpl implements MyService { 

    //these method gives me error 
    @Override 
    public DummyResponse getResponse(DummyRequest request) { 
     //do sth 
     return response; 
    } 

} 

那麼,爲什麼我這樣做呢?因爲我想用自己的請求和響應對象編寫大量的服務實現,所以我可以從一個點 - 服務接口來處理它們。

我該如何使用接口來做到這一點?或者這是一個錯誤的方法?真正的做法是什麼?

在此先感謝。

回答

4

要正確實現MyService接口,必須提供與類型參數匹配的通用方法getResponse。但是,您隱式地放置類型參數DummyResponseDummyRequest,並且您沒有聲明類型參數RTMyServicegetResponse方法。

此處的解決方案是將類型參數RT移動到接口本身。

interface MyService<R extends Response, T extends Request<R>> { 
    R getResponse(T request); 
} 

然後MyServiceImpl可以執行時其提供類型參數的MyService,和getResponse可以使用這些類型參數的成功實施getResponse方法。

class MyServiceImpl implements MyService<DummyResponse, DummyRequest> { 

    // This now implements MyService correctly. 
    @Override 
    public DummyResponse getResponse(DummyRequest request) { 
     //do sth 
     return response; 
    } 

} 
+0

感謝您的回答,我知道我可以做到這一點,但與此方法我必須使用接口與通用定義。我只想在方法級別使用泛型。我的服務必須留在我的服務,而不是MyService oko 2015-02-06 21:17:50

+2

想一想它的水平。如果一個接口說實現者必須提供一種接受任何有效的R和T組合的方法,那麼它是如何實現該接口來創建一個只接受一個特定組合的類? Java泛型不是模板工具,現在忘記語法看起來是一樣的,你會爲自己節省很多挫折。 – Affe 2015-02-06 21:26:25

+2

@oko問題是,如果泛型必須存在於接口中的方法中,那麼所有具體類必須在實現方法上具有泛型。所有具體的類都需要採取任何類型的「響應」和任何與其關聯的「請求」。非泛型接口上的泛型方法的設計在這裏不正確;正確的設計是通用接口。 – rgettman 2015-02-06 21:29:47