我正在从正在使用分页的服务查询 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/