2016-11-29 49 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>。使用所提出的解决方案,它不再是必需的。