类型参数问题:"无法从参数化类型中选择"

时间:2016-11-29 10:33:15

标签: java generics

我正面临着仿制药的问题。

以下是我使用泛型的一个类:

public class TokenServerResponse<D> {

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

我们的课程:TokenServerResponse使用D参数化。

我想在我们的一个方法中指定类型如下:

   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);

1 个答案:

答案 0 :(得分:4)

这里:

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>。  使用所提出的解决方案,不再需要它。