ジェネリックが実行時に使用しているオブジェクトのタイプをどのように判断できますか?
4 に答える
型消去が原因で、ジェネリック オブジェクト インスタンスの実際の型パラメーターを特定できません。最善の方法は、実際の型を知る必要があるコードにクラス オブジェクトを渡すことができるように設定することです。たとえば、これはjava.util.EnumMap
そのコンストラクターの 1 つで行うことです。
Java はタイプ eraserを使用するため、(たとえば) T
inを意味する場合はできません。実行時には、 aは. これは、フープをジャンプしてパラメーターの型を見つけることができる匿名クラスのエッジケースを除いて当てはまります。しかし、一般的なケースでは、それはできません。通常、その情報は個別に伝達する必要があります。List<T>
List<T>
List
まず、ジェネリックとは何かを説明します
Java のジェネリックは、Java 5で追加された重要な機能の 1 つです。
オラクルのドキュメントから:
ジェネリックは、コンパイル時のより厳密な型チェックを提供し、ジェネリック プログラミングをサポートするために、Java 言語に導入されました。ジェネリックスを実装するために、Java コンパイラは型消去を以下に適用します。
ジェネリック型のすべての型パラメーターをそれらの境界またはオブジェクト (型パラメーターが無制限の場合) に置き換えます。したがって、生成されたバイトコードには、通常のクラス、インターフェース、およびメソッドのみが含まれます。
型の安全性を維持するために、必要に応じて型キャストを挿入します。
- 拡張されたジェネリック型でポリモーフィズムを保持するブリッジ メソッドを生成します。
型の消去により、パラメーター化された型に対して新しいクラスが作成されないことが保証されます。したがって、ジェネリックはランタイム オーバーヘッドを発生させません。
このリンクの助けを借りて、実行時にジェネリック型を取得できるようにする方法
読む: http://www.west-wind.com/weblog/posts/2011/Nov/11/Dynamically-creating-a-Generic-Type-at-Runtime