C++ テンプレートと C# ジェネリック、およびそれらが Java の型消去されたジェネリックとどのように異なるかについての議論を読んでいました。たとえば、コレクションを扱う場合など、Java はまだ実行時にキャストを使用しているという声明を読みました。これが本当なら、私はそれを知りませんでした!
次のようなコードがあるとしましょう。
ArrayList<SomeClass> list = new ArrayList<SomeClass>();
...
SomeClass object = list.get(0);
私の質問はです。これは効果的にコンパイルされていますか
ArrayList list = new ArrayList();
...
SomeClass object = (SomeClass) list.get(0);
もしそうなら、なぜですか?リストが型であるという事実はArrayList<SomeClass>
、コンパイル時と実行時に、ArrayList 内に SomeClass のみが格納されることを保証すると思いましたか? または、安全でない型キャストを行って を に変換できますArrayList<OtherClass>
かArrayList<SomeClass>
?
Javaジェネリックで実行時の型キャストが行われる他の機会はありますか?
最後に、実行時のキャストが実際に使用されている場合、JIT が実行時のキャスト チェックを省略できる場合はありますか?
(マイクロ最適化には価値がない、プリエンプティブな最適化は諸悪の根源である、などの回答/コメントは控えてください。他の同様の質問でこれらを目にします。これらの点はよく理解されていますが、試すポイントを奪うものではありません型消去されたジェネリックが内部でどのように実装されているかを理解するために。)