Javaはなぜ汎用配列をサポートしないのか

1912 ワード

の原因となる
以前leetcodeが問題をブラシしたとき、ある問題がHashMapの配列を新築しようとしたが、いつもコンパイルが間違っていて、Javaでは通常の基本タイプの配列のように、直接汎用配列を新築することはできないことに突然反応した.その理由を比較的簡単明瞭に説明してほしい.
ぶんせき
まずJava配列の場合、配列は内部要素のタイプを明確に知らなければならない.また、コンパイラは「このタイプは、配列に新しい要素を挿入するたびにタイプチェックを行い、不一致はjava.lang.ArrayStoreExceptionエラーを投げ出す」ことを覚えている.
汎用配列を作成しようとすると、次のように直接書きます.
HashMap map = new HashMap[];

実はコンパイルできません.なぜならJavaの汎用型はタイプ消去(type erasure)によって実現されるからである.タイプ消去とは、簡単に言えばJavaはコンパイル中にすべての汎用情報が消去されます.
コードに定義されているList Listなどのタイプは、コンパイル にListになります.
List strList = new ArrayList(); 
List objList = new ArrayList();
List rawList = new ArrayList();

たとえば の3つのリストでは,タイプパラメータを した ,リストの の はすべてObjectである.JVMが ているのはListだけであり、 に されたタイプ はJVMには えない.
Javaコンパイラは、コンパイル にエラーが する のある をできるだけ しますが、 にタイプ が することは けられません.したがって、Javaは、タイプ のため、 インスタンスの を します.

の を するにはどうすればいいですか? することはできませんが、 を に タイプに することができます. :
List[] genericArray = (List[])new ArrayList[10];

Javaでは、 インスタンスの は されていますが、 の は されていません. って, を に することによって, を することができる.
コンパイル はエラーを しませんが、タイプ が するため、 のような で が する があります.
List[] genericArray = (List[])new ArrayList[10];
genericArray[0] = new ArrayList(Arrays.asList(new String[]{"Hello"}));

まとめ
Javaでは の は されていないため、コンパイラの を な で することは されません.これにより、コードエラーが した 、コンパイラがエラーをタイムリーに できず、 なリスクをもたらす があります.
を いたいときは、おとなしく なArrayListでしょう.の
:[[1]]javaはなぜ をサポートしないのですか?- った - [[2]]Java ( ): と