在 Wrapper Classes 中不提供无参数构造函数的理由是什么?我知道它们天生就是为 Wrapping 原始类型而构建的,因此正确的方法是为构造函数提供原始类型。
但是,考虑到原始类型具有无参数构造函数,为什么它们没有呢?
此外,如果它们有无参数构造函数,它们可以被实例化为T.class.newInstance()
. 但是,由于newInstance()
需要无参数构造函数,因此这不适用于 Wrapper Classes。
包装器对象是不可变的。这意味着一旦为包装对象分配了一个值,该值就无法更改。为无法更改值的对象设置默认值没有多大意义。你不会想要一个newInstance()
包装类,因为那样你就会被默认值困住。
我认为这是因为这些类包装的值是最终不可变的(这是我一直在寻找的词,谢谢比尔:))。如果有一个默认构造函数,那将毫无用处,因为您以后无法更改该类包装的原语。
在构造函数中提供原始类型是没有用的。包装类的类型表示原始类型。由于实例化的包装对象不能更改(不可变),因此只有一次机会给它一个值:在其构造期间。如果包装类对象不是不可变的,就会发生奇怪的事情。如果你有一个默认的包装类构造函数,它的值是什么?
一个更好的问题是为什么他们有构造函数。我们应该只对价值感兴趣。对象标识与类型的含义无关。
大多数(但不是全部)反射的使用是没有意义的。像这样构造一个不可变的值几乎没有价值。Class.newInstance
由于其异常行为而特别邪恶。T.class
where T
is 泛型参数由于擦除而无法编译。
只有对象有构造函数,原语没有构造函数,所以它们没有默认构造函数。原语通过将对象/值初始化为所有 0 字节来获得它们的默认值。(布尔值为假,浮点数为0.0f,双精度为0.0,空值作为参考)
您似乎想使用 newInstance() 创建一个对象,但唯一未初始化的值为 null。
很可能是因为虽然原语具有默认值(0、0.0f、0.0、0L、false 等),但 Wrappers 通常将这些默认值表示为 null。