3

Javaジェネリックを再グレードする質問があります。私が知っているように、一般的な情報はコンパイル時にのみ利用可能です。「型消去」と呼ばれるプロセスを通じて、コードがコンパイルされて.classファイルが作成されると、すべてのTYPE情報が消えます。

つまり、.javaファイルがコンパイルされると、List myList = new arrayList()は、リストが.javaファイル内の文字列のリストとして宣言されている場合でも、.classファイルのバイトコードに含まれます。

そうは言っても、以下のシナリオを検討してください。

署名付きのメソッドを含むjarファイルがあります

public void check(List<String> p)

このメソッドを別のコードから呼び出すと、コンパイラーは、メソッドをチェックするための引数はList<String>、他には何もないように強制します。

checkメソッドはjar(.classファイル)に存在するためList<String>、.classファイルの作成時にTYPE情報がすでに削除されている場合、コンパイラはに必要なTYPE情報をどのように認識しますか?

4

1 に答える 1

9

型消去は、ジェネリックに関連するすべての情報を消去するわけではありません。簡単に言えば、問題のメソッドのシグネチャ(public void check(List<String> p))は完全に詳細に保持されます。getGenericParameterTypes()保存された情報は、リフレクションAPI( 、getTypeParameters()およびその他のメソッドなど)を使用して実行時に取得できます 。

于 2012-12-29T17:07:43.653 に答える