ホームページ >Java >&#&チュートリアル >Java でジェネリック型のクラス リテラルを取得するにはどうすればよいですか?

Java でジェネリック型のクラス リテラルを取得するにはどうすればよいですか?

DDD
DDDオリジナル
2024-12-10 05:43:16542ブラウズ

How Can I Get Class Literals for Generic Types in Java?

Java: ジェネリック型のクラス リテラルの取得

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同じ生の型リストに変換します。その結果、各ジェネリック型のパラメーター化に個別の実行時表現は存在しません。

これは、ジェネリック型に存在する唯一のクラス リテラルが、生の型 (例: List.class) 用であることを意味します。

リフレクションと型消去:

一方、型消去ではクラス リテラルの使用が制限されます。ジェネリック型の存在を完全に排除するわけではありません。 java.lang.reflect の Field.getGenericType() メソッドは、実行時にジェネリック型情報へのアクセスを提供します。ただし、このメソッドはイントロスペクションに限定されており、クラス リテラルの取得には使用できません。

結論:

型の消去により、クラス リテラルを取得することはできません。ジェネリック型の特定のパラメーター化のクラス リテラル。ジェネリック型のクラス リテラルは常に生の型を表し、型パラメーター情報は保持されません。

以上がJava でジェネリック型のクラス リテラルを取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。