Java 班级之间的差异<;T>;和reflect.TypeToken

Java 班级之间的差异<;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

我有两个代码片段,它们做完全相同的事情。 若您可以使用类,那个么您会在什么情况下使用TypeToken

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,这是一个很棒的答案。