Class <t>和reflect.TypeToken之间的区别

时间:2018-04-23 05:21:53

标签: java

我有两个完全相同的代码片段。 如果您可以使用Class,那么您将使用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);
  }

和以下代码:

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);
  }

1 个答案:

答案 0 :(得分:2)

Javadoc of TypeToken

中有一个很大的暗示
  

表示泛型类型T. Java尚未提供方法   代表泛型类型,所以这个类就是。

他们对这句话和随后的信息的意思是:

如果T是泛型类型(例如java.util.List),则Class<T>不包含有关泛型类型参数的足够信息。您可以从Class<List>找出它代表List,但无法从Class<List>中找出它代表特定类型的列表,例如List<String>。您不能在Java中编写List<String>.class,它会被编译器拒绝。

TypeToken确实包含有关泛型类型的泛型类型参数的信息。