我正在使用正在使用分页的服务查询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
。
我不是在为这个问题寻找其他类型的实现,我只是对这种行为感到好奇。仿制药是否在编译时间内被评估,或者导致这种行为的原因是什么?是否可以解决?
答案 0 :(得分:0)
您在此处看到的是type erasure。简而言之,泛型类型仅用于编译时。编译后,字节代码将不再具有此信息。
您的解决方案非常完美。它被称为type token。您也可以在java lib中找到它,例如在EnumMap
:
EnumMap<MyEnum, String> map = new EnumMap<>(MyEnum.class);