[解決済み] Javaにおける菱形演算子(<>)のポイントは何ですか?
質問
java 7のdiamond演算子では、以下のようなコードが可能です。
List<String> list = new LinkedList<>();
しかし、Java 5/6では、単純に書くことができる。
List<String> list = new LinkedList();
私の型消しの理解では、これらは全く同じものです。(ジェネリックはとにかく実行時に削除される)。
なぜわざわざダイヤモンドを使うのか?それによってどんな新しい機能、型安全性が実現されるのでしょうか?もし、新しい機能をもたらさないのであれば、なぜそれを機能として言及するのでしょうか?私のこのコンセプトの理解に誤りがあるのでしょうか?
解決方法は?
の問題は
List<String> list = new LinkedList();
は、左側で
ジェネリック
タイプ
List<String>
ここで、右側では
生
タイプ
LinkedList
. Javaにおける生の型は、事実上、ジェネリック以前のコードとの互換性のためにのみ存在し、新しいコードでは、以下の場合を除いて決して使用すべきではありません。
を使用する必要があります。
さて、Javaに最初からジェネリクスがあり、型がなかったとしたら、たとえば
LinkedList
ジェネリック型のコンストラクタは、可能であれば代入の左辺から型パラメータを自動的に推論するようにできたはずです。しかし、そうしなかったために、後方互換性のために生の型とジェネリック型を別個に扱わなければならなくなった。そのため、彼らは
若干異なる
しかし、同じように便利なのが、汎用オブジェクトの新しいインスタンスを、その型パラメータを繰り返すことなく宣言する方法、つまりdiamond演算子です。
元の例である
List<String> list = new LinkedList()
というのも、コンパイラはこの代入に対して警告を発しなければならないからです。こう考えてみてください。
List<String> strings = ... // some list that contains some strings
// Totally legal since you used the raw type and lost all type checking!
List<Integer> integers = new LinkedList(strings);
ジェネリックスは、間違ったことをしないようにコンパイル時に保護するために存在します。上の例では、raw型を使うと、この保護機能が働かず、実行時にエラーが発生することになります。これがraw型を使うべきではない理由です。
// Not legal since the right side is actually generic!
List<Integer> integers = new LinkedList<>(strings);
しかし、diamond演算子を使えば、右辺の代入を左辺と同じ型パラメータを持つ真のジェネリックインスタンスとして定義することができます...それらのパラメータを再度タイプする必要はありません。これにより、ジェネリックインスタンスの安全性を ほとんど 生の型を使用するのと同じ労力です。
理解すべき重要な点は、生の型(
<>
は、汎用型と同じようには扱えません。生の型を宣言した場合、ジェネリックの利点や型チェックは何も得られません。また
ジェネリックは、Java言語の汎用的な部分です。
の引数なしコンストラクタだけに適用されるわけではありません。
Collection
s!
関連
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException: 1
-
Java コンパイルエラー - スレッド "main" で例外 java.lang.Error: 未解決のコンパイル問題です。
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaでNullPointerExceptionを回避する方法
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Java Mapの各エントリを効率的に反復処理するには?
-
[解決済み] Javaでメモリーリークを発生させるにはどうしたらいいですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
Intellij IDEAのエラー「CreateProcess error=2, system could not find specified file」に対する完璧な解決策です。
-
Eclipseプロンプトを実行する java仮想マシンを使用しない
-
node js npm gruntインストール、elasticsearch-head 5.Xインストール
-
マスキング このリソースにアクセスするには、完全な認証が必要です。
-
[オリジナル】java学習ノート【II】よくあるエラー クラスパス上のクラスファイルが見つからない、またはアクセスできない場合
-
org.glassfish.jersey.servlet.ServletContainer
-
HttpClientがGZIP形式でない場合の対処法
-
起動時にEclipseエラーが発生しました。起動中に内部エラーが発生しました。java.lang.NullPoin: "Javaツーリングの初期化 "中に内部エラーが発生しました。
-
テストが見つかりませんでした