1. ホーム
  2. java

[解決済み] なぜJava CollectionsはPrimitives型を直接格納できないのですか?

2022-06-22 19:17:50

質問

Javaコレクションはオブジェクトのみを格納し、プリミティブ型は格納しませんが、ラッパークラスは格納できます。

なぜこの制約があるのでしょうか?

どのように解決するのか?

これはJavaの設計上の決定であり、いくつかの人が間違いだと考えているものです。コンテナはオブジェクトを必要とし、プリミティブはオブジェクトから派生しないのです。

これは、.NET 設計者が JVM から学び、多くのケースでボクシングが排除されるように値型とジェネリックスを実装した 1 つの場所です。CLR では、ジェネリック コンテナーは基礎となるコンテナー構造の一部として値型を格納することができます。

Java は、JVM からのサポートなしに、コンパイラーで 100%ジェネリック サポートを追加することを選択しました。JVMはそれが何であるかであるため、quot;non-object"オブジェクトをサポートしません。Javaジェネリックを使えば、ラッパーがないように見せかけることができますが、箱詰めすることによるパフォーマンスの代償はまだ残っています。これは、特定のクラスのプログラムにとって重要なことです。

ボクシングは技術的な妥協点であり、実装の詳細が言語に漏れていると感じています。Autoboxing は素晴らしい構文上の糖分ですが、それでもパフォーマンス上のペナルティがあります。どちらかといえば、オートボックスするときにコンパイラーが警告してくれることを望みます。(私が知っている限り、今はそうかもしれませんが、私はこの答えを2010年に書きました)。

SOでのボクシングに関する良い説明です。 なぜいくつかの言語ではBoxingとUnboxingが必要なのでしょうか?

Javaジェネリクスへの批判も。 なぜJavaのジェネリックの実装が悪いと主張する人がいるのでしょうか?

Javaの弁護をすると、後ろを振り返って批判するのは簡単です。JVMは時の試練に耐えており、多くの点で良い設計になっています。