Java ParameterizedType.getRawType()返回j.l.r.Type,而不是类<>;?
Java ParameterizedType.getRawType()返回j.l.r.Type,而不是类<>;?,java,reflection,Java,Reflection,参数化类型#getRawType()返回一个类型,而不是类(尽管我得到了java.lang.Class现在实现了类型)。getRawType()为什么不将其返回类型声明为Class?是否存在getRawType()的结果可能不是类的极端情况 这就足够了,可以按原样使用j.l.r.Type;这似乎是一个他们本可以为我们节省一点时间的实例。Sun对ParameterizedType的实现定义了getRawType()方法来返回类。因此它显然只返回Class 然而,在我的类路径上还有一些paramet
参数化类型#getRawType()
返回一个类型,而不是类
(尽管我得到了java.lang.Class
现在实现了类型
)。getRawType()
为什么不将其返回类型声明为Class
?是否存在getRawType()
的结果可能不是类的极端情况
这就足够了,可以按原样使用j.l.r.Type
;这似乎是一个他们本可以为我们节省一点时间的实例。Sun对ParameterizedType
的实现定义了getRawType()
方法来返回类。因此它显然只返回Class
然而,在我的类路径上还有一些parameteredType
的实现——来自hibernate validator、aspectj、hibernate annotations和jaxb。其中一些返回类
,一些返回-类型
。但是我不知道它们是如何使用的。它必须返回一个类
对象,没有其他方法
为什么??谁知道呢,也许是一些理想主义偏见。如果它返回类
,它将是新的类型
接口中类
的唯一外观
真正的问题是类
和类型
的混合。以前,所有类型都在类中表示。这已经是一团糟,但仍然可以忍受。种类不多
有了新的泛型类型,他们应该设计出一个更干净、符合规范的类型
层次结构,独立于类
。相反,他们将类
与类型
合并,造成了更多的混乱。整个层次结构根本没有意义。任何不熟悉这一主题、不了解历史的人都会被这种胡说八道吓坏
我不会把类型的设计保持在高标准。例如,ParameterizedType
定义equals()
,但不定义hashCode()
。无法在一个哈希映射中使用两个ParameterizedType
实现。通配符也是一种类型吗?他妈的不
方法的名称getRawType()
简直是白痴。它与原始类型无关。它应该清楚地命名为getClassOrInterface()
。会不会太冗长了?然后查看getActualTypeArguments()
。(是的,它返回的是真实的参数!不是假的!)我在想这个,我有预感。也许他们想让未来的疯狂成为可能:
ParameterizedType parameterized =
(ParameterizedType) List.class.getMethod("iterator").getGenericReturnType();
Type raw = parameterized.getRawType();
public class Z类型接口层次结构除了反射api之外还有其他用途。例如,代码生成库可以定义自定义实现。JDK 8本身有3种不同的通配符类型实现。如果ParameterizeType.getRawType()返回了一个类实例,那么您需要能够随时创建一个类实例
类是JVM中根深蒂固的类型,它绑定回本机托管内存。要创建类实例,必须具有定义该类的字节码。但在代码生成库中,字节码甚至还不存在。如果他们要求ParameteredType返回类,那么类型接口层次结构的适用性将仅限于反射api
这看起来可能没什么大不了的,但演员阵容也不重要
getOwnerType()返回一个类型,因为它本身可能是一个类或另一个ParameteredType。理论上,它可能返回一个TypeVariable,因为以下是有效的Java:
public class Z<L extends List<?>> {
L<Double> test;
}
first(M映射){…}
但是,它被编译为类型变量擦除的静态引用,在本例中,M.Entry将被编译为Map.Entry。至少根据我的测试,从反射api调用getOwnerType()而不是TypeVariable将是一个类。此线程表明返回类型始终是一个类,但我也在寻找关于此的进一步意见。对我来说,看起来像是接口和实现的基本分离。Javadoc将类
列为类型
的唯一实现,但JRE也包含几十个实现类型
的受保护类。如果类型
不是标记接口,我会购买接口与实现分离参数。要处理类型
,我必须测试它是否是类
,参数化类型
,通配符类型
,通用数组类型
,等等。如果我可以用一个任意对象完成我想要的,就像一个类型
,那么结果的运行时类是java.lang.class
,还是你所拥有的一切对我来说都无关紧要。@skaffman:这只表明类
可能是jdk中唯一的公共和文档化实现。哈?它返回一个类型
编辑ok,它只类
实现sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
奇怪的是ParameterizedTypeImpl.getOwnerType()
返回一个类型
ParameterizedType
只是一个接口,没有定义equals()
或hashCode()
<代码>sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
至少在sun JRE 1.5.022中定义了这两者。如果从反射中获得的ParameterizedTypeImpl
s的行为不符合您的要求,则始终可以将它们转换为自己的ParameterizedType
实现。@Andy实现此接口的类实例必须实现一个equals()方法,该方法使共享相同泛型类型声明且具有相同类型参数的任意两个实例相等
<M extends Map<?,?>> M.Entry<?,?> first(M map) { ... }