Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ParameterizedType.getRawType()返回j.l.r.Type,而不是类<>;?_Java_Reflection - Fatal编程技术网

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) { ... }