在Wrapper类中不提供no-arg构造函数的理由是什么?我知道它们本身是为包装原始类型而构建的,所以正确的方法是为构造函数提供原始类型。
但是,考虑到原始类型没有arg构造函数,为什么它们没有?
此外,如果他们没有arg构造函数,则可以将它们实例化为T.class.newInstance()
。但是,由于newInstance()
需要no-arg构造函数,因此无法使用Wrapper类。
答案 0 :(得分:11)
包装器对象是不可变的。这意味着一旦包装器对象分配了一个值,就无法更改该值。为无法更改其值的对象设置默认值没有多大意义。你不会想要获得一个包装类的newInstance()
,因为那样你就会陷入默认值。
答案 1 :(得分:2)
我认为这是因为这些类包含的值意味着 final 不可变( 是我正在寻找的单词,感谢Bill :))。如果有一个默认的构造函数,它将毫无用处,因为你以后无法更改该类包装的原语。
答案 2 :(得分:2)
在构造函数中提供基本类型没有用处。包装类的类型表示基本类型。由于实例化的包装器对象不能更改(不可变),因此只有一次机会为其赋值:在构造期间。如果包装类对象不是不可变的,那么可能会发生奇怪的事情。 如果你有一个默认的包装类构造函数,它的值是什么?
答案 3 :(得分:1)
一个更好的问题是他们为什么要有构造函数。我们应该只对价值感兴趣。对象标识与类型的含义无关。
大多数(但不是全部)使用反射都是毫无意义的。像这样构造一个不可变的值几乎没有价值。由于其异常行为,Class.newInstance
特别邪恶。 T.class
其中T
是一个通用参数,因擦除而无法编译。
答案 4 :(得分:1)
只有对象具有构造函数,基元没有构造函数,因此它们没有默认构造函数。由于对象/值被初始化为全0字节,原语获得其默认值。 (布尔值为false,浮点数为0.0f,double为0.0,null为引用)
您似乎想要使用newInstance()创建一个对象,但是唯一未初始化的值为null。
答案 5 :(得分:0)
最有可能的原因是,虽然基元具有默认值(0,0.0f,0.0,0L,false等),但Wrappers通常将这些默认值表示为null。