2

在 Wrapper Classes 中不提供无参数构造函数的理由是什么?我知道它们天生就是为 Wrapping 原始类型而构建的,因此正确的方法是为构造函数提供原始类型。

但是,考虑到原始类型具有无参数构造函数,为什么它们没有呢?

此外,如果它们有无参数构造函数,它们可以被实例化为T.class.newInstance(). 但是,由于newInstance()需要无参数构造函数,因此这不适用于 Wrapper Classes。

4

6 回答 6

11

包装器对象是不可变的。这意味着一旦为包装对象分配了一个值,该值就无法更改。为无法更改值的对象设置默认值没有多大意义。你不会想要一个newInstance()包装类,因为那样你就会被默认值困住。

于 2009-05-17T12:54:15.817 回答
2

我认为这是因为这些类包装的值是最终不可变的(是我一直在寻找的词,谢谢比尔:))。如果有一个默认构造函数,那将毫无用处,因为您以后无法更改该类包装的原语。

于 2009-05-17T12:53:50.077 回答
2

在构造函数中提供原始类型是没有用的。包装类的类型表示原始类型。由于实例化的包装对象不能更改(不可变),因此只有一次机会给它一个值:在其构造期间。如果包装类对象不是不可变的,就会发生奇怪的事情。如果你有一个默认的包装类构造函数,它的值是什么?

于 2009-05-17T13:19:27.457 回答
1

一个更好的问题是为什么他们有构造函数。我们应该只对价值感兴趣。对象标识与类型的含义无关。

大多数(但不是全部)反射的使用是没有意义的。像这样构造一个不可变的值几乎没有价值。Class.newInstance由于其异常行为而特别邪恶。T.classwhere Tis 泛型参数由于擦除而无法编译。

于 2009-05-17T14:19:32.570 回答
1

只有对象有构造函数,原语没有构造函数,所以它们没有默认构造函数。原语通过将对象/值初始化为所有 0 字节来获得它们的默认值。(布尔值为假,浮点数为0.0f,双精度为0.0,空值作为参考)

您似乎想使用 newInstance() 创建一个对象,但唯一未初始化的值为 null。

于 2009-05-17T16:00:22.160 回答
0

很可能是因为虽然原语具有默认值(0、0.0f、0.0、0L、false 等),但 Wrappers 通常将这些默认值表示为 null。

于 2009-05-17T12:43:01.523 回答