実行時にジェネリック型のクラスを決定するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-11 21:31:03
オリジナル
846 人が閲覧しました

How Can I Determine the Class of a Generic Type at Runtime?

ジェネリック型のクラスの決定

ジェネリック プログラミングでは、使用されているジェネリック型のクラスにアクセスすることが望ましいことがよくあります。ただし、ジェネリック型情報は実行時に消去されるため、このタスクは本質的に困難になります。この記事では、この制限を克服する効果的な回避策について説明します。

課題

次のコード スニペットを考えてみましょう。

public class MyGenericClass<T> {
  public void doSomething() {
    T bean = (T)someObject.create(T.class);
  }
}
ログイン後にコピー

このコードは、次のことを試みています。サードパーティ ライブラリの create メソッドを使用して、型 T のインスタンスを作成します。このメソッドには、引数として T の実際のクラスが必要です。ただし、T.class に直接アクセスすると、型パラメーター T のクラス リテラルが不正ですエラーが発生します。

回避策

ジェネリック型情報は実行時に消去されるため、代替手段アプローチが必要です。次の回避策には、ジェネリック型のクラスを引数として受け入れる静的ファクトリ メソッドの作成が含まれます。

public class MyGenericClass<T> {

    private final Class<T> clazz;

    public static <U> MyGenericClass<U> createMyGeneric(Class<U> clazz) {
        return new MyGenericClass<U>(clazz);
    }

    protected MyGenericClass(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void doSomething() {
        T instance = clazz.newInstance();
    }
}
ログイン後にコピー

Usage

この回避策を使用するには、 createMyGeneric ファクトリ メソッドを使用した MyGenericClass のインスタンス:

MyGenericClass<MyClass> genericInstance = MyGenericClass.createMyGeneric(MyClass.class);
ログイン後にコピー

これにより、MyGenericClass インスタンス内の clazz フィールドを介して、ジェネリック型の実際のクラスへのアクセスが提供されます。

欠点

この回避策は機能しますが、ソリューションに定型コードが追加されます。さらに、ジェネリック型情報に直接アクセスできないため、doSomething メソッド内のジェネリック メソッドまたはコンストラクターの使用が制限されます。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート