在Java中解析一个类型意味着什么?
下面是我尝试理解它们的一些用法示例:
来自 的
如果基础字段的类型是类型变量或参数化类型,则创建它。否则,它将被解决。
要使这种形式的反射起作用,需要创建
提供
来自 TypeToken#resolveType()
(http://docs.guava-libraries.googlecode.com/git-history/v18.0/javadoc/com/google/common/reflect/TypeToken.html#resolveType(java.lang.reflect.Type%29)的
根据该类型表示的类型上下文解析给定的类型。例如:
new TypeToken<List<String>>() {}.resolveType(
List.class.getMethod("get", int.class).getGenericReturnType())
=> String.class
,
发布于 2015-07-29 03:50:50
关于您的第一个问题,请考虑如下字段声明
public List<String> parameterizedField;
与Class
对象一样,JVM不维护表示List<String>
类型的对象。因此,它需要创建一个表示该类型的新Type
(在本例中为ParameterizedType
)对象并返回它(它还可能缓存它以供将来使用)。它将对以下对象执行相同的操作
public E genericField;
在本例中创建一个TypeVariable
对象。
为
public String regularTypeField;
但是,类型是已知的,JVM为String
维护了一个Class
对象,因此只需要返回该对象。
在第二种情况下,类型令牌hack
new TypeToken<List<String>>() {}
在内部创建表示List<String>
的Type
,否则由于类型擦除而无法直接检索该not。
resolveType
调用检查您给它的类型,并根据TypeToken
的类型参数解析它。
在您的示例中,调用的getGenericReturnType()
将返回一个表示在List
类中声明的类型变量的Type
。由于您已经使用String
参数化了List
,因此resolveType()
将返回String
。它将您在类型标记中提供的类型参数绑定到在方法或字段中使用的相应类型变量。
你是否使用过
new TypeToken<List<String>>() {}.
resolveType(Iterator.class.getMethod("next").getGenericReturnType())
它将返回E
,因为该类型变量与您在类型令牌中绑定的变量无关。
这两种情况下resolved的用法是不同的。
https://stackoverflow.com/questions/31685551
复制相似问题