Mar*_*cak 10 java primitive-types
有背后的特殊原因的Java包装类(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开发人员没有实现它有一个特殊原因.
Java 设计者的决策可能不太抽象,并且无法在数字类型(例如Integer)和非数字类型(例如Boolean)之间找到许多相似之处来按超类对它们进行分组。
不过,所有数字类型都扩展了真正代表“可转换为基本类型, , , , ,Number的数值”。bytedoublefloatintlongshort
实际上,所有包装类都有一个公共接口Comparable<T>(例如Comparable<Integer>for Integer)。