【发布时间】:2013-11-26 03:47:04
【问题描述】:
请参阅Boolean#TYPE 了解我所指的示例。
所有包装类(Boolean、Double、Integer 等)都有一个与之关联的静态 Class 字段,称为 TYPE。这是什么意思?
具体来说,这里有一些软测试:
System.out.println(Boolean.class == Boolean.TYPE);
System.out.println(Boolean.TYPE.isInstance(Boolean.valueOf(true)));
两者都评估为假。 (附带说明,.equals 比较是不必要的,因为 Class 不会覆盖 Object 的 equals。)
Boolean.class 和 Boolean.TYPE 都是 Class<Boolean>,因为它们是 == 可比较而没有错误的。比较具有不同声明的泛型类型的两个对象是非法的。
进一步检查,TYPE 字段是通过调用包私有本机方法 Class#getPrimitiveClass 检索到的,如下所示:
public static final Class<Boolean> TYPE = Class.getPrimitiveClass("boolean");
对方法本身的评论也不是特别有用。它说它为该类型返回 VM 的类对象,这是相当明显的,因为它是一个本地方法。
除了 Java 文档对“表示原始类型”的模糊暗示之外,我找不到任何关于此的文档。这个领域有什么用途吗?它在包装类本身中未使用。
(已编辑)
System.out.println(boolean.class == Boolean.TYPE);
是真的。
反射也是一种用途:
try {
Constructor ctor = Boolean.class.getConstructor(Boolean.class);
} catch (Exception e) {
System.out.println("NoSuchMethodException gets thrown");
}
try {
Constructor ctor = Boolean.class.getConstructor(Boolean.TYPE);
System.out.println(ctor.newInstance(true));
} catch (Exception e) {
// (no exception thrown)
}
我发现了一些引用该内容的 SO 线程,例如 this one。我想我来自谷歌的“错误结局”,可以说是找不到任何结果。
但考虑到“原始类”(boolean.class、int.class 等)的存在并不能真正解释 TYPE 字段的存在。基本上它“就在那里”?我还是不太明白。
【问题讨论】:
标签: java class types wrapper primitive