私の理解では、Javaに生の型と型の消去があるのは、ジェネリックが導入されたときに、既存のコードを壊すことなくジェネリックにすることのできなかった標準APIがあったからです。生の型/型の消去を必要とせずにジェネリックスに対応できないJava(.NETではありません)はなぜですか?
ジェネリックスも.NETのいくつかの時点で導入されましたが、この機能は生の型や型の削除に依存しない方法で実装されています(そうであれば、ユーザーにはわかりません)。したがって、既存のAPIは変更されず(System.Collections名前空間のコードなど)、新しい汎用API(System.Collections.Generic名前空間のコードなど)が導入されました。
.NETのジェネリックスとは異なり、Javaのジェネリックはどのように生のタイプ/タイプの消去が必要ですか?
さらに、.Netは既存のコンテナを異なる名前空間の汎用バージョンに置き換えました。それらを使用したいコードは、一度に移植する必要があります。 Javaの方法では、単に既存のコンテナを汎用にすることができました。したがって、ビット単位での移植は、時折キャストと警告の抑制を意味します。 –
@SebastianRedl:基本的に、コンパイル時のみの機能であるジェネリックの拡張です。 – SLaks
.NETはバイトコード言語を変更しましたが、汎用オブジェクトがその型を知るためにJavaが必ずしもそうする必要はなかったと思います。私は、すべての汎用オブジェクトインスタンスがインスタンス化された型の組み合わせを示す1つ以上のコンパイラ生成フィールドを含むことができ、適切なときにこのようなフィールドを検証するコードをコンパイラが生成することができると考えていました。 'ArrayList'が 'ArrayList'以外の型であると実装された場合、もっと大きな問題があると思います... –
supercat