在Java中解析类型意味着什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (27)

在Java中解析类型意味着什么?

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

来自Field#getGenericType()

如果基础字段的类型是类型变量或参数化类型,则会创建它。否则,它已解决。

  • 需要为这种形式的反射创建类型变量或参数化类型,因为它们不能被加载,因为它们在运行时并不真正“存在”?
  • 所以如果运行时存在某些东西,它可以“解决”?通过类加载器?

来自TypeToken#resolveType()

根据此类型表示的类型上下文解析给定的类型。例如:

new TypeToken<List<String>>() {}.resolveType(
    List.class.getMethod("get", int.class).getGenericReturnType())
=> String.class
  • 这我真的没有一点。不确定这段代码在做什么。
提问于
用户回答回答于

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

public List<String> parameterizedField;

JVM不维护表示类型的对象List<String>(因为它是Class对象)。因此它需要创建一个新的TypeParameterizedType在这种情况下)表示该类型的对象并将其返回(它也可能将其缓存以供将来使用)。它会做同样的事情

public E genericField;

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

对于

public String regularTypeField;

然而,类型是已知的,JVM维护一个Class对象String,因此只需要返回它。

在第二种情况下,类型令牌破解

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

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

这个resolveType调用会检查Type你给它并根据TypeToken类型参数来解析它。

在你的例子中,被getGenericReturnType()调用的将返回一个Type表示类中声明的类型变量List。既然你已经参数化ListStringresolveType()会返回String。它将您在类型标记中提供的类型参数绑定到方法或字段中使用的相应类型变量。

你用过了吗?

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

它会返回,E因为该类型变量与您在类型标记中绑定的变量无关。

在两种情况下解决的用法都不同。

扫码关注云+社区