型変数は現在の型を参照できますか?
現在の型のインスタンスを返す関数を作成するとします。 T がサブタイプを明確に参照していることを確認する方法はありますか (例、T はクラス B の B を参照する必要があります)?
ソリューションの実装
StriplingWarrior の応答の拡張、これを達成するには次のパターンが不可欠です (階層的な流暢なビルダーのレシピ) API):
ソリューション
基本抽象クラスまたはインターフェイスの定義:
を拡張するインスタンスのランタイム タイプを取得するためのコントラクトclass:
abstract class SelfTyped<SELF extends SelfTyped<SELF>> { abstract SELF self(); }
中間抽象クラスの作成:
中間クラスは再帰型パラメーター SELF を維持します。直接使用を防ぐために、これらは抽象的である必要があります:
public abstract class MyBaseClass<SELF extends MyBaseClass<SELF>> extends SelfTyped<SELF> {...}
リーフ クラスの定義:
最後のクラスは、SELF 型パラメータをそのクラスで解決します。自分のタイプ。安全のために最終的なものにしてください:
public final class MyLeafClass extends MyBaseClass<MyLeafClass> {...}
使用例:
MyLeafClass mlc = new MyLeafClass().baseMethod().leafMethod(); AnotherLeafClass alc = new AnotherLeafClass().baseMethod().anotherLeafMethod();
注意と結論
このパターンは、Java の「奇妙な繰り返しテンプレート」の実装です。強力ではありますが、慎重な使用が必要であり、内部 API のみに予約するのが最善です。このパターンは本質的に安全ではないため、誤用を避けるために注意して使用する必要があります。ただし、効果的に使用すると、ビルダー API の表現力と使いやすさを向上させることができます。
以上がJava では型変数はその定義クラスを参照できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。