类型参数问题:“无法从参数化类型中进行选择”

2022-09-04 03:19:59

我遇到了泛型问题。

这是我使用泛型的类之一:

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

答案 1

这里:

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

你不需要任何演员。

当然,如果您没有十几个类来使它们从该类继承,并且您希望在客户端代码中使用特定类型,则此解决方案很有趣。
在你的情况下, 需要进行处理,因为你的泛型类型不依赖于特定类型,而是依赖于 Object 类型,因此您应该以这种方式一次强制转换:to 。有了建议的解决方案,就不再需要它了。TokenServerResponseDigestResponseDataTokenServerResponseTokenServerResponse<DigestResponseData>


答案 2

推荐