のようにジェネリックスを多く使用するJavalibを静的に再コンパイルしましたCollection<?>
が、発行された.NET dllはCollection
、型パラメーターではなく、のみを使用します。どうして?
2172 次
1 に答える
6
JavaジェネリックはJavaコンパイラによって処理され、コンパイル時に非ジェネリックバージョンに変換されます。これは、CLRが型パラメーターをファーストクラスでサポートしている.NETとは異なります。バイトコードレベルでは、ArrayList<T>
は単純なものになりArrayList
ます。
Javaドキュメントを引用するには:
ジェネリックは、消去と呼ばれるフロントエンド変換としてJavaコンパイラによって実装されます。これは、ジェネリックを使用するコードを非ジェネリックコードに変換または書き換えるプロセスです(つまり、新しい構文を現在のJVM仕様にマップします)。つまり、この変換により、すべての汎用型情報が消去されます。山かっこ間のすべての情報が消去されます。たとえば、
LinkedList<Integer>
になりLinkedList
ます。他の型変数の使用は、型変数の上限(たとえば、Object
)に置き換えられ、結果のコードが型が正しくない場合は、適切な型へのキャストが挿入されます。
于 2009-09-25T12:36:04.583 に答える