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

bal*_*teo 6 java generics

我遇到泛型问题。

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

public class TokenServerResponse<D> {

    private String responseCode;
    private String responseMessage;
    private D responseData;
    ....
Run Code Online (Sandbox Code Playgroud)

在这里,我们的class:使用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);
    }
Run Code Online (Sandbox Code Playgroud)

但是,出现以下编译器错误:cannot select from parameterized type

如何使用type参数D?我也曾尝试无济于事。我怎么了?

digest方法的调用方式如下:

    ResponseEntity<TokenServerResponse<DigestResponseData>> digestResponseEntity = digest(823, "1505", pan, true);
Run Code Online (Sandbox Code Playgroud)

dav*_*xxx 12

这里 :

return restTemplate.postForEntity("/digest", digestRequest, TokenServerResponse<DigestResponseData>.class);
Run Code Online (Sandbox Code Playgroud)

如果你的方法希望有一个类值作为最后一个参数,你只能为它提供一个类。提供具有泛型类型的类是不可能的。
强制转换是不可避免的,但如果您将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> {

}
Run Code Online (Sandbox Code Playgroud)

现在你可以TokenServerResponseDigestResponseData在这里使用类:

return restTemplate.postForEntity("/digest", digestRequest, TokenServerResponseDigestResponseData.class);
Run Code Online (Sandbox Code Playgroud)

当你这样做时:

TokenServerResponseDigestResponseData instance = ...
DigestResponseData data = instance.getResponseData();
Run Code Online (Sandbox Code Playgroud)

你不需要任何演员。

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