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) に依存しており、特定のリスクが生じます。 :
これらのリスクを軽減するには、関連するクラスがパブリックに拡張できないことを確認し、パッケージプライベートのコンストラクターとメソッドの使用を検討してください。 SelfTyped と self() の場合。
この回避策は現在の型を参照する手段を提供しますが、さらなる複雑さと制限が生じます。実装する前に、利点と潜在的な欠点を慎重に比較検討することをお勧めします。明示的な型参照が重要な場合、このソリューションは便利ですが、これに過度に依存したり、パブリック API に依存したりすることは避けてください。
以上がJava で型変数を使用して現在の型を参照するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。