为什么包装类没有常见的超类型?

Mar*_*cak 10 java primitive-types

有背后的特殊原因包装类(java.lang.Integer,java.lang.Boolean,...)没有一个共同的超类型?


我问,因为WrapperType::getType沿着经典函数(例如)函数Object::getClass将返回原始类型的类是非常方便的.

更具体地说,上下文是通过反射调用构造函数,其中只有Class<T>参数和参数Object[]

例如:

public static <T> T createInstance(Class<T> clz, Object... params) throws Exception
Run Code Online (Sandbox Code Playgroud)

为了获得构造函数,我可以通过以下方式获取参数类型:

Class<?>[] c = Arrays
        .stream(params)
        .map(Object::getClass)
        .toArray(Class<?>[]::new);
return clz.getConstructor(c).newInstance(params);
Run Code Online (Sandbox Code Playgroud)

但这当然会失败,像构造者一样 String::new(char[], int, int);

如果存在超类型,我可以这样做:

.map( o -> o.getClass().isPrimitive() ? ((WrapperType) o).getType() : o.getClass() )
Run Code Online (Sandbox Code Playgroud)

我想java开发人员没有实现它有一个特殊原因.

And*_*lko 1

Java 设计者的决策可能不太抽象,并且无法在数字类型(例如Integer)和非数字类型(例如Boolean)之间找到许多相似之处来按超类对它们进行分组。

不过,所有数字类型都扩展了真正代表“可转换为基本类型, , , , ,Number的数值”。bytedoublefloatintlongshort

实际上,所有包装类都有一个公共接口Comparable<T>(例如Comparable<Integer>for Integer)。