当前位置: 首页 > 知识库问答 >
问题:

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

廉志强
2023-03-14

我面临泛型的问题。

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

public class TokenServerResponse<D> {

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

在这里,我们的类:TokenServerACK使用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);
    }

但是,我遇到以下编译器错误:无法从参数化类型中选择。

如何使用类型参数D?我也试过铸造,但没有成功。我做错了什么?

下面是如何调用digest方法:

    ResponseEntity<TokenServerResponse<DigestResponseData>> digestResponseEntity = digest(823, "1505", pan, true);

共有1个答案

荆弘伟
2023-03-14

这里:

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

你不需要任何石膏。

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

 类似资料:
  • 我试图模拟以进行测试: ClassA ClassA=Mockito。模拟(A类); 莫基托。when(classA.void(Mockito.any)(ClassB 但我有关于“B类”的信息 ClassA无效:ClassA。void(@NotNull ClassB mockito-core-4.0.0,springboot,maven 知道怎么解决吗?

  • 我想创建一个rest来在服务器和客户端之间进行通信。 下面给出的构造函数: 对于普通类型,我可以执行以下操作: 如何传递泛型类型,如: 以下代码无效: 我遇到一个运行时错误:无法强制转换为ParameteredType。

  • 我对这个flutter简单图表代码有问题。在我尝试运行代码时显示此错误。有人能帮我吗...... 参数类型'List 这是代码示例:

  • 我对弗利特和我是新手;我一直在尝试开发一款带有PHP API后端的应用程序。在无数的答案和在线研究中,我无法找到解决我所面临问题的方法。我希望有人能告诉我我做错了什么。 我试图从API中获取数据,并将其显示在卡中。下面是我的代码: 希望能得到一些帮助。非常感谢。

  • 问题内容: 我在弄清楚以下RHS中期望使用什么类型参数时遇到问题 为什么副本不合法? 问题答案: 具体参数化类型的数组固有地被破坏。请记住,数组是协变的,数组类型检查是运行时操作。在运行时,所有泛型都已被擦除,因此Array Store检查无法从中分辨出来。 泛型的基本约定是:“我,编译器,保证如果编写的代码不生成警告,则在运行时永远不会得到类强制转换异常。” 编译器也不能向您保证,如果在数组中放

  • 你好,我在小部件上的以下代码中出错 参数类型'List 这是我的代码 我的代码与上面的图表插件不兼容吗?如何解决这个问题?