java - 将方法的泛型传递为泛型类泛型

标签 java generics jackson

我正在从正在使用分页的服务查询 JSON 对象。我想创建一个泛型类和一个泛型方法,其中的值被解码为相应的类型,然后我遇到了一个问题,无法将该方法的泛型作为另一个泛型类型的泛型传递。

考虑以下类和方法:

PageResponse.class

public class PageResponse<T> {
    @JsonProperty("values")
    private List<T> values;
    @JsonProperty("next")
    private String next;
}

以及方法

public void fetchAllFoos(String url, AsyncResp resp) {
    this.<Foo>fetchAllPage(url, new ArrayList<Foo>(), resp);
}

public void fetchAllBars(String url, AsyncResp resp) {
    this.<Bar>fetchAllPage(url, new ArrayList<Bar>(), resp);
}

private <T> void fetchAllPage(String next, List<T> results, AsyncResp resp) {
    TypeReference<PageResponse<T>> valueTypeRef = new TypeReference<PageResponse<T>>() {
    };
    client.makeGetRequest(next, e -> {
        PageResponse<T> page = Json.mapper.readValue(e.toString(), valueTypeRef);
        results.addAll(page.getValues());
        if (page.getNext() != null) {
            fetchAllPage(page.getNext(), results, resp);
        } else {
            resp.returnValue(results);
        }
    });
}

代码编译良好,并且可以正常工作,除了 TypeReference的通用类型是 PageRequest<T>而不是PageRequest<Foo>PageRequest<Bar>这引导我到 PageResponse.values视为 List<Object> .

我并不是在寻找解决该问题的其他类型的实现,我只是对这种行为感到好奇。泛型是否在编译时进行评估,或者是什么导致了这种行为,可以解决吗?

最佳答案

您在这里看到的是type erasure 。简而言之,泛型类型仅用于编译时。编译后,字节码将不再有此信息。

您的解决方案非常完美。它被称为 type token 。您也可以在 java lib 中找到它,例如在EnumMap :

EnumMap<MyEnum, String> map = new EnumMap<>(MyEnum.class);

关于java - 将方法的泛型传递为泛型类泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43371372/

相关文章:

java - Java 中的泛型内部类

c - C中的泛型编程

java - 如何使用 Jackson JSON 将 JSON 字符串转换为 Map<String, Set<String>>

c# - XAML 中的泛型

java - 使用 Jackson 将 XML 属性添加到手动构建的节点树

java - 如何检查字符串是否是有效的 Json Schema?

java - 页面滚动时滚动模态框

java - 刷新 Android 应用程序 Activity

java - 如何正确设置 Java/Selenium 配置以运行自动化测试?

java - 焦点窗口的 GetModuleFileName JNA Windows 操作系统