ホームページ >Java >&#&チュートリアル >Java で型変数を使用して現在の型を参照するにはどうすればよいですか?

Java で型変数を使用して現在の型を参照するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-18 08:02:10420ブラウズ

How Can I Refer to the Current Type with a Type Variable in Java?

型変数を使用して現在の型を参照する方法はありますか?

Java では、型を使用して現在の型を直接参照することはできません変数。この問題は、現在の型のインスタンスを返すメソッドを作成しようとするときに発生し、サブタイプを扱うときに問題になります。たとえば、基本クラスで戻り値の型が T のジェネリック メソッドを宣言すると、実際のサブクラスの型ではなく、サブクラスの基本クラスの型が参照されます。

再帰的境界と抽象クラス/インターフェイスを利用した回避策

これに対処するには、次のように再帰的境界と抽象クラス階層を使用できます。

abstract class SelfTyped<SELF extends SelfTyped<SELF>> {
    abstract SELF self();
}

class MyBaseClass<SELF extends MyBaseClass<SELF>>
        extends SelfTyped<SELF> {

    MyBaseClass() { }

    public SELF baseMethod() {
        return self();
    }
}

final class MyLeafClass extends MyBaseClass<MyLeafClass> {

    @Override
    MyLeafClass self() {
        return this;
    }

    public MyLeafClass leafMethod() {
        return self();
    }
}

この例では、このアプローチでは、リーフ クラスは再帰型パラメータ SELF を独自の型に解決し、self() を実装します。リーフ クラスは直接使用でき、正しい戻り値の型を維持しながらメソッド チェーンを行うことができます:

MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod();

AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();

注意: この手法は、奇妙なことに繰り返し発生するテンプレート パターン (CRT) に依存しており、特定のリスクが生じます。 :

  • 型置換の脆弱性: 派生クラスSELF をオーバーライドして別の型を返すと、自己型の保証が損なわれる可能性があります。
  • 不正な self() 実装: self() の派生クラス実装は現在のインスタンスを正確に返さない可能性があります。

これらのリスクを軽減するには、関連するクラスがパブリックに拡張できないことを確認し、パッケージプライベートのコンストラクターとメソッドの使用を検討してください。 SelfTyped と self() の場合。

評価と使用に関する考慮事項

この回避策は現在の型を参照する手段を提供しますが、さらなる複雑さと制限が生じます。実装する前に、利点と潜在的な欠点を慎重に比較検討することをお勧めします。明示的な型参照が重要な場合、このソリューションは便利ですが、これに過度に依存したり、パブリック API に依存したりすることは避けてください。

以上がJava で型変数を使用して現在の型を参照するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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