我遇到泛型问题。
这是我使用泛型的类之一:
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>。使用建议的解决方案,不再需要它。
| 归档时间: |
|
| 查看次数: |
5406 次 |
| 最近记录: |