解析 Java 中的类型是什么意思?

What does it mean to resolve a type in Java?

解析 Java 中的类型是什么意思?

以下是我尝试理解它们的一些用法示例:

来自Field#getGenericType():

If the type of the underlying field is a type variable or a parameterized type, it is created. Otherwise, it is resolved.

来自TypeToken#resolveType():

Resolves the given type against the type context represented by this type. For example:

new TypeToken<List<String>>() {}.resolveType(
    List.class.getMethod("get", int.class).getGenericReturnType())
=> String.class

关于你的第一个问题,考虑像

这样的字段声明
public List<String> parameterizedField;

JVM 不维护表示类型 List<String> 的对象(就像 Class 对象一样)。因此,它需要 创建 一个新的 Type (在本例中为 ParameterizedType )代表该类型的对象和 return 它(它也可能缓存它将来使用)。它会对

做同样的事情
public E genericField;

在这种情况下创建一个 TypeVariable 对象。

对于

public String regularTypeField;

但是,类型是已知的,JVM 为 String 维护一个 Class 对象,因此只需要 return 那个。


在第二种情况下,类型标记 hack

new TypeToken<List<String>>() {}

在内部创建一个 Type 表示 List<String>,否则由于类型擦除而无法直接检索。

resolveType 调用检查您提供的 Type 并根据 TypeToken 的类型参数解析它。

在您的示例中,调用的 getGenericReturnType() 将 return 表示 List class 中声明的类型变量的 Type。由于您已将 List 参数化为 String,因此 resolveType() 将 return String。它将您在类型标记中提供的类型参数绑定到方法或字段中使用的相应类型变量。

你用过吗

new TypeToken<List<String>>() {}.
    resolveType(Iterator.class.getMethod("next").getGenericReturnType())

它将 returned E 因为该类型变量与您在类型标记中绑定的变量无关。


两种情况下 resolved 的用法不同。