2

ラッパー クラスで引数なしのコンストラクタを提供しない理由は何ですか? それらは本質的にプリミティブ型をラップするために構築されていることを知っているので、正しい方法はコンストラクターにプリミティブ型を提供することです。

ただし、プリミティブ型には引数のないコンストラクターがあることを考えると、なぜコンストラクターがないのでしょうか?

さらに、引数のないコンストラクターがある場合は、 としてインスタンス化できますT.class.newInstance()。ただし、newInstance()引数なしのコンストラクターが必要なため、これはラッパー クラスでは機能しません。

4

6 に答える 6

11

ラッパー オブジェクトは不変です。これは、ラッパー オブジェクトに値が割り当てられると、その値を変更できないことを意味します。値を変更できないオブジェクトにデフォルト値を設定しても意味がありません。デフォルト値に固執するため、ラッパー クラスのを取得したくないでしょう。newInstance()

于 2009-05-17T12:54:15.817 に答える
2

コンストラクターでプリミティブ型を提供することには意味がありません。ラッパークラスの型は、プリミティブ型を示します。インスタンス化されたラッパーオブジェクトは変更できない(不変)ため、値を与える可能性は1つだけです。それは構築中です。ラッパークラスオブジェクトが不変でない場合、奇妙なことが起こる可能性があります。デフォルトのラッパークラスコンストラクターがある場合、その値はどうなりますか?

于 2009-05-17T13:19:27.457 に答える
2

これらのクラスによってラップされた値が最終的に不変であることを意図しているためだと思います(それは私が探していた言葉でした、ビルに感謝します:))。デフォルトのコンストラクターがあったとしても、後でクラスによってラップされたプリミティブを変更できないため、まったく役に立ちません。

于 2009-05-17T12:53:50.077 に答える
1

より良い質問は、なぜコンストラクターがあるのか​​ ということです。価値だけに関心を持つべきです。オブジェクト ID は、型の意味とは無関係です。

リフレクションのほとんど (すべてではない) の使用は無意味です。このような不変値の構築には、ほとんど価値がありません。Class.newInstance例外動作のために特に悪です。T.classwhereTはジェネリック パラメータであり、消去のためにコンパイルされません。

于 2009-05-17T14:19:32.570 に答える
1

オブジェクトのみがコンストラクターを持ち、プリミティブにはコンストラクターがないため、デフォルトのコンストラクターがありません。プリミティブは、オブジェクト/値がすべて 0 バイトに初期化されることにより、デフォルト値を取得します。(boolean では false、float では 0.0f、double では 0.0、参照として null です)

newInstance() でオブジェクトを作成したいようですが、初期化されていない値は null だけです。

于 2009-05-17T16:00:22.160 に答える
0

おそらく、プリミティブにはデフォルト値 (0、0.0f、0.0、0L、false など) がありますが、ラッパーは通常、これらのデフォルト値を null として表現するためです。

于 2009-05-17T12:43:01.523 に答える