我正面临着仿制药的问题。
以下是我使用泛型的一个类:
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);
答案 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
进行处理,因此您应该以这种方式一次投射:TokenServerResponse
到TokenServerResponse<DigestResponseData>
。
使用所提出的解决方案,不再需要它。