4

これら 2 つの用語の扱いが異なるコンパイラを偶然見つけました。入力すると:

LinkedList<String> list = new LinkedList();

生の型に関するコンパイラの警告が表示されます。でも:

LinkedList<String> list = new LinkedList<>();

警告を削除します。2 つのステートメントが本質的に同じことを意味しているように思えます (つまり、指定されたオブジェクト タイプを持たない新しい LinkedList を作成します)。では、なぜコンパイラはすべて空のジェネリックを持っているのでしょうか? ここでの違いは何ですか?

4

4 に答える 4

5

ステートメントはまったく同じことを意味するわけではありません。

最初のステートメントはLinkedList、宣言されたジェネリックに型なしを適合させようとしLinkedList<String>、適切に警告をスローします。

Java 1.7 以降で有効な 2 番目のステートメントは、型推論を使用して、宣言型の型パラメーターを使用して型パラメーターを推測します。さらに、これはメソッド呼び出しで使用できる場合もあります。ただし、常に機能するとは限りません。

詳細については、このページを参照してください。

于 2012-07-10T20:12:49.373 に答える
4

これは、Java 7 のダイヤモンド演算子であり、型の記述を再度保存するのに役立ちます。Java 7 では、これは、宣言の左側で使用される同じジェネリック型引数と同等です。したがって、初期化はタイプ セーフであり、警告は発行されません。

于 2012-07-10T20:10:40.257 に答える
1

LinkedList<> では、Java 7 の新しい Diamond 演算子を使用します。

Diamod オペレーターは、行の左側に設定された汎用値を使用します。

Java 6 では、これは機能しません。

ただし、ひし形演算子を使用すると、割り当ての右側を、左側と同じ型パラメーターを持つ真のジェネリック インスタンスとして定義できます。これらのパラメーターを再度入力する必要はありません。raw 型を使用するのとほぼ同じ労力で、ジェネリックの安全性を維持できます。

理解すべき重要なことは、生の型 (<> を含まない) はジェネリック型と同じように扱うことができないということです。生の型を宣言すると、ジェネリックの利点と型チェックがまったく得られません。また、ジェネリックスは Java 言語の汎用的な部分であることも覚えておく必要があります。コレクションの引数なしのコンストラクターだけに適用されるわけではありません。

から抽出: https://stackoverflow.com/a/10093701/1281306

于 2012-07-10T20:11:07.150 に答える
0

バックワード互換性 (レガシー コードとの相互運用) が、java が上記の署名を許可する理由です。ジェネリックはコンパイル時の構文のみです。実行時に「すべての一般的な」構文は削除されます。クラスファイルを逆コンパイルしたかどうかだけがわかります。このドキュメントを読んでください。

LinkedList list = new LinkedList();
于 2012-07-10T20:07:12.983 に答える