Java 班级之间的差异<;T>;和reflect.TypeToken
我有两个代码片段,它们做完全相同的事情。 若您可以使用类,那个么您会在什么情况下使用TypeTokenJava 班级之间的差异<;T>;和reflect.TypeToken,java,Java,我有两个代码片段,它们做完全相同的事情。 若您可以使用类,那个么您会在什么情况下使用TypeToken public static <T> List<T> readJsonArray(String filename, Class<T> clazz) throws IOException { JavaType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayLis
public static <T> List<T> readJsonArray(String filename, Class<T> clazz) throws IOException {
JavaType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, clazz);
return objectMapper.readValue(loadFile(filename), listType);
}
公共静态列表readJsonArray(字符串文件名,类clazz)引发IOException{
JavaType listType=objectMapper.getTypeFactory().constructCollectionType(ArrayList.class,clazz);
返回objectMapper.readValue(加载文件(文件名)、listType);
}
以及以下代码:
public static <T> List<T> readJsonArray(String filename, TypeToken<T> typeToken) throws IOException {
JavaType listType = objectMapper.getTypeFactory().constructCollectionType(ArrayList.class, typeToken.getRawType());
return objectMapper.readValue(loadFile(filename), listType);
}
publicstaticlist readJsonArray(字符串文件名,TypeToken-TypeToken)引发IOException{
JavaType listType=objectMapper.getTypeFactory().constructCollectionType(ArrayList.class,typeToken.getRawType());
返回objectMapper.readValue(加载文件(文件名)、listType);
}
在
表示泛型类型T。Java尚未提供
表示泛型类型,这个类就是这样
他们对这句话和后续信息的意思是:
如果T
是泛型类型(例如java.util.List
),则Class
不包含有关泛型类型参数的足够信息。您可以从类
中找到它代表的是列表
,但无法从类
中找到它代表的是一个特定类型的列表,如列表
。您不能用Java编写List.class
,编译器会拒绝它
TypeToken
确实包含泛型类型的泛型类型参数的信息。在这种特殊情况下还是一般情况下?因为TypeToken.getRawType
返回一个Class
对象,所以这些调用是幂等的。谢谢Erwin,这是一个很棒的答案。