Type接口层次结构还有其他用途,不仅仅是反射api。例如,代码生成库可以定义自定义实现。 JDK 8本身有3种不同的WildcardType实现。如果ParameterizedType.getRawType()返回一个Class实例,那么您需要能够随时创建一个Class实例。
类是一种非常深入的JVM类型,它绑定回本机管理的内存。要创建一个Class实例,您必须具有定义该类的字节码。但是在代码生成库的情况下,字节代码还不存在。如果他们要求ParameterizedType返回一个Class,它将会限制Type接口层次结构仅适用于反射API。
这可能看起来不是什么大不了的事,但也不是一个演员。
ParameterizedType.getOwnerType()返回一个Type,因为它本身可以是一个Class或另一个ParameterizedType。它可以在理论上返回的TypeVariable,如下面的是有效的Java:
<M extends Map<?,?>> M.Entry<?,?> first(M map) { ... }
但是,它编译成一个静态参考类型变量的删除,在这种情况下M.Entry将被编译为Map.Entry的。至少根据我的测试,而不是TypeVariable,从反射API调用getOwnerType()将是一个Class。
此主题http://www.velocityreviews.com/forums/t524488-raw-type-other-than-a-class-possible.html表明返回类型一直是一个类,但我也在寻找对此有进一步的意见。 – 2011-04-23 21:50:07
看起来像接口和实现的基本分离。 Javadoc列举'Class'作为'Type'的唯一实现,但JRE包含几十个实现'Type'的受保护类。 – skaffman 2011-04-23 21:52:37
如果'Type'不是标记接口,我会购买接口与实现参数的分离。为了完成我想用'Type'做的事情,我必须测试它是否是'Class >','ParameterizedType','WildcardType','GenericArrayType'等等。如果我可以用一个'Type'来完成我想要的任意对象,那么结果的运行时类是否是'java.lang.Class'或者你有什么关系对我来说无关紧要。 – pholser 2011-04-23 22:05:58