2016-11-29 75 views
4

我正面臨泛型的問題。類型參數問題:「無法從參數化類型中選擇」

這是我的一個類使用泛型:

public class TokenServerResponse<D> { 

    private String responseCode; 
    private String responseMessage; 
    private D responseData; 
    .... 

這裏我們班:TokenServerResponseD參數。

我想在我們的方法之一指定類型如下:

protected ResponseEntity<TokenServerResponse<DigestResponseData>> digest(long globalMerchantUId, String expirydate, String pan, boolean updateExpiryDate) throws Exception { 
     DigestRequest digestRequest = new DigestRequest(); 
     digestRequest.setGlobalMerchantUid(globalMerchantUId); 
     digestRequest.setExpiryDate(expirydate); 
     digestRequest.setPan(pan); 
     digestRequest.setUpdateExpiryDate(updateExpiryDate); 
     return restTemplate.postForEntity("/digest", digestRequest, TokenServerResponse<DigestResponseData>.class); 
    } 

不過,我得到以下編譯器錯誤:cannot select from parameterized type

如何使用類型參數D?我也嘗試鑄造無濟於事。我錯了什麼?

這裏是如何digest方法被稱爲:

ResponseEntity<TokenServerResponse<DigestResponseData>> digestResponseEntity = digest(823, "1505", pan, true); 
+0

你不能做TokenServerResponse .class。嘗試TokenServerResponse.class –

+0

@MauricePerry。你的建議編譯得很好,但是在哪一點,我該如何利用類型參數?換句話說,當客戶端調用摘要方法時,我該如何依賴這種類型? – balteo

+0

當您在類中聲明字段responseData時,您可以利用類型參數。它純粹是靜態的,所有可能的參數只有一個類。 –

回答

3

這裏:

return restTemplate.postForEntity("/digest", digestRequest, TokenServerResponse<DigestResponseData>.class); 

如果你的方法需要有一個類值作爲最後一個參數,你只能爲它提供一個類。提供具有泛型類的類是不可能的。
鑄造是不可避免的,但如果你改變你的TokenServerResponse類也使用繼承。現在

public abstract class TokenServerResponse<T> { 
    private String responseCode; 
    private String responseMessage; 
    private T responseData; 

    public T getResponseData() { 
     return responseData; 
    } 
} 

public class TokenServerResponseDigestResponseData extends TokenServerResponse<DigestResponseData> { 

} 

可以使用TokenServerResponseDigestResponseData類在這裏:

return restTemplate.postForEntity("/digest", digestRequest, TokenServerResponseDigestResponseData.class); 

當你這樣做:

TokenServerResponseDigestResponseData instance = ... 
DigestResponseData data = instance.getResponseData(); 

你不需要任何轉換。

當然這個解決方案很有趣,如果你沒有打過幾十個類讓它們繼承自TokenServerResponse類,並且你希望在客戶端代碼中使用特定的類型。
就你而言,需要DigestResponseData才能進行處理,因爲你的泛型類型不依賴於特定的類型,而是依賴於對象類型,所以你應該以這種方式一次施放:TokenServerResponseTokenServerResponse<DigestResponseData>。使用所提出的解決方案,它不再是必需的。