Java のジェネリックは、コンパイル時に型の安全性を確保する強力な機能です。ただし、その実装では、ジェネリック型のクラス リテラルを取得する際に課題が生じます。
問題:
通常、クラス リテラルは次の構文を使用して取得されます。 :
Class<Foo> cls = Foo.class;
しかし、List などのジェネリック型になると、複雑になります。 raise:
Class<List> cls = List.class // warning: List should be parameterized
ワイルドカード > を追加して型を一般化すると、型不一致エラーが発生します:
Class<List<?>> cls = List.class // type mismatch
実際の型パラメータを指定しようとします。 、List
解決策:
残念ながら、Java では特定の型パラメータを持つジェネリック型のクラス リテラルを静的に取得することは不可能です。これは、型消去 と呼ばれるプロセスによるものです。
コンパイル中に、ジェネリック型情報が削除され、生の型のみが残ります。たとえば、両方の List
これは、ジェネリック型に存在する唯一のクラス リテラルが、生の型 (例: List.class) 用であることを意味します。
リフレクションと型消去:
一方、型消去ではクラス リテラルの使用が制限されます。ジェネリック型の存在を完全に排除するわけではありません。 java.lang.reflect の Field.getGenericType() メソッドは、実行時にジェネリック型情報へのアクセスを提供します。ただし、このメソッドはイントロスペクションに限定されており、クラス リテラルの取得には使用できません。
結論:
型の消去により、クラス リテラルを取得することはできません。ジェネリック型の特定のパラメーター化のクラス リテラル。ジェネリック型のクラス リテラルは常に生の型を表し、型パラメーター情報は保持されません。
以上がJava でジェネリック型のクラス リテラルを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。