将方法的泛型作为泛型类泛型

时间:2017-04-12 13:45:18

标签: java generics jackson

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

考虑以下类和方法:

PageResponse.class

cmd.exe

和方法

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> 1}}被视为PageResponse.values

我不是在为这个问题寻找其他类型的实现,我只是对这种行为感到好奇。仿制药是否在编译时间内被评估,或者导致这种行为的原因是什么?是否可以解决?

1 个答案:

答案 0 :(得分:0)

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

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

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