7

のようにジェネリックスを多く使用するJavalibを静的に再コンパイルしましたCollection<?>が、発行された.NET dllはCollection、型パラメーターではなく、のみを使用します。どうして?

4

1 に答える 1

6

JavaジェネリックはJavaコンパイラによって処理され、コンパイル時に非ジェネリックバージョンに変換されます。これは、CLRが型パラメーターをファーストクラスでサポートしている.NETとは異なります。バイトコードレベルでは、ArrayList<T>は単純なものになりArrayListます。

Javaドキュメントを引用するには:

ジェネリックは、消去と呼ばれるフロントエンド変換としてJavaコンパイラによって実装されます。これは、ジェネリックを使用するコードを非ジェネリックコードに変換または書き換えるプロセスです(つまり、新しい構文を現在のJVM仕様にマップします)。つまり、この変換により、すべての汎用型情報が消去されます。山かっこ間のすべての情報が消去されます。たとえば、LinkedList<Integer>になりLinkedListます。他の型変数の使用は、型変数の上限(たとえば、Object)に置き換えられ、結果のコードが型が正しくない場合は、適切な型へのキャストが挿入されます。

于 2009-09-25T12:36:04.583 に答える