java – 原始包装器和静态“TYPE”类对象

有关我所指的示例,请参阅Boolean#TYPE.

所有包装类(Boolean,Double,Integer等)都有一个与之关联的静态Class字段,称为TYPE.这是什么意思?

具体来说,这里有一些软测试:

System.out.println(Boolean.class == Boolean.TYPE);
System.out.println(Boolean.TYPE.isInstance(Boolean.valueOf(true)));

两者都评价为假. (并且作为旁注,由于Class不会覆盖Object中的equals,因此不需要.equals比较.)

Boolean.class和Boolean.TYPE都是Class< Boolean>因为它们==可比较没有错误.使用不同声明的泛型类型比较两个对象是非法的.

在进一步检查时,通过调用包私有本机方法Class#getPrimitiveClass来检索TYPE字段,如下所示:

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字段的存在.基本上它就是“就在那里”?我仍然没有真正得到它.

最佳答案
表示基元类型的类在指定或检查获取或返回基元的方法时很有用.例如,如果您的类有一个看起来像这样的方法

class Test {
    static int round(float val) {...}
}

并且您希望通过反射访问此方法,您需要这样做:

Method round = Test.class.getMethod("round", Float.TYPE);

您也可以检查返回类型:

if (round.getReturnType == Integer.TYPE) {
    System.out.println("Method 'round' returns an int.");
}

改用Float.class

Method round = Test.class.getMethod("round", Float.class);

不会起作用,因为那将采用不同的方法 – 这一个:

static int round(Float val) {...}

转载注明原文:java – 原始包装器和静态“TYPE”类对象 - 代码日志