解析 Java 中的类型是什么意思?
What does it mean to resolve a type in Java?
解析 Java 中的类型是什么意思?
以下是我尝试理解它们的一些用法示例:
If the type of the underlying field is a type variable or a parameterized type, it is created. Otherwise, it is resolved.
- 需要为这种形式的反射创建类型变量或参数化类型才能工作,因为它们无法加载,因为它们在运行时实际上"exist"?
- 所以如果运行时存在某些东西,它可以是 "resolved"?通过类加载器?
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 的用法不同。
解析 Java 中的类型是什么意思?
以下是我尝试理解它们的一些用法示例:
If the type of the underlying field is a type variable or a parameterized type, it is created. Otherwise, it is resolved.
- 需要为这种形式的反射创建类型变量或参数化类型才能工作,因为它们无法加载,因为它们在运行时实际上"exist"?
- 所以如果运行时存在某些东西,它可以是 "resolved"?通过类加载器?
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 的用法不同。