なぜjavaは汎用配列をサポートしないのですか?
1155 ワード
Javaはなぜ汎用配列をサポートしないのですか?
このようにするとタイプの安全を破壊するからです.核心的な問題はJava汎用型にある:Javaの汎用型はコンパイルという層にとどまり、実行時になると、これらの汎用型の情報は実際に消去される.Javaのやり方はJVMを修正する必要はなく、潜在的な大幅な変更とそれに伴うリスクを減らし、Java Bytecode規範の設計当初の先天的な不足を反映しているかもしれない.
Javaでは、Object[]配列は任意の配列の親であってもよいし、あるいは、任意の配列は定義時に要素タイプの親を指定する配列に上方転換することができる.このとき、元のデータタイプとは異なるが、後に使用する親タイプを満たすとコンパイルに問題はない.ただし、実行時に配列が入っているオブジェクトのタイプがチェックされ、ArrayStoreExceptionが放出されます.
Javaのモデルはコンパイル後にタイプ情報を消去するため、Javaが類似のものを使用することを許可する場合は、次のようになります.
このような文では,その後のコードでObject[]に変換してMapインスタンスを入れることができる.このようにすると、コンパイラはタイプエラーを発見できないだけでなく、実行時の配列ストレージチェックもできません.それは私たちがMapのオブジェクトを中に入れることを見ることができます.私たちが定義したのはこの時に消去されました.そこで、それにとって、Mapであれば、合法的です.考えてみてください.私たちはもともとMapを入れる配列を定義していましたが、結果としてMapを入れることができます.次に、コードが元の定義で値を取ろうとしたら、結果は何なのかは言うまでもありません.
ylxfc(作者)リンクから転載:https://www.zhihu.com/question/20928981/answer/39234969
このようにするとタイプの安全を破壊するからです.核心的な問題はJava汎用型にある:Javaの汎用型はコンパイルという層にとどまり、実行時になると、これらの汎用型の情報は実際に消去される.Javaのやり方はJVMを修正する必要はなく、潜在的な大幅な変更とそれに伴うリスクを減らし、Java Bytecode規範の設計当初の先天的な不足を反映しているかもしれない.
Javaでは、Object[]配列は任意の配列の親であってもよいし、あるいは、任意の配列は定義時に要素タイプの親を指定する配列に上方転換することができる.このとき、元のデータタイプとは異なるが、後に使用する親タイプを満たすとコンパイルに問題はない.ただし、実行時に配列が入っているオブジェクトのタイプがチェックされ、ArrayStoreExceptionが放出されます.
String[] strArray = new String[20];
Object[] objArray = strArray;
objArray[0] = new Integer(1); // throws ArrayStoreException at runtime
Javaのモデルはコンパイル後にタイプ情報を消去するため、Javaが類似のものを使用することを許可する場合は、次のようになります.
Map[] mapArray = new Map[20];
このような文では,その後のコードでObject[]に変換してMapインスタンスを入れることができる.このようにすると、コンパイラはタイプエラーを発見できないだけでなく、実行時の配列ストレージチェックもできません.それは私たちがMapのオブジェクトを中に入れることを見ることができます.私たちが定義したのはこの時に消去されました.そこで、それにとって、Mapであれば、合法的です.考えてみてください.私たちはもともとMapを入れる配列を定義していましたが、結果としてMapを入れることができます.次に、コードが元の定義で値を取ろうとしたら、結果は何なのかは言うまでもありません.
ylxfc(作者)リンクから転載:https://www.zhihu.com/question/20928981/answer/39234969