私はこの再帰的なinterface
定義をapache thrift
ソースコードで理解しようとしています
public interface TBase<T extends TBase<?, ?>, F extends TFieldIdEnum> extends Comparable<T>, Serializable {
私の理解から、TBase
型パラメーターT
とを含むインターフェイスF
です。
T
TBase
任意の型を含む型パラメーターを持つ拡張する必要があるという制約があります。
私が混乱しているのは、終了するものです TBase
私が持っていると言います
public class TBaseImpl<A, B> implements TBase<A, B>
A
でなければなりません TBase
したがって、別のクラス実装が必要です A
public class TBaseImplA<C, D> implements TBase<C, D>
しかしC
、TBase
したがって、別のクラス実装が必要です C
これは永遠に続きます。
だから私の質問は
TBase
誰かが私に方向を示すことができますか?
ありがとう
そのため、Aを実装する別のクラスが必要です
それは必ずしも本当ではありません。このタイプの再帰境界では、サブタイプを作成するときに制約を満たすための2つの方法があります。
public class TBaseImpl<A extends TBase<A, B>, B extends TFieldIdEnum> implements TBase<A, B>
以上の可能性
public class TBaseImpl<A extends TBaseImpl<A, B>, B extends TFieldIdEnum> implements TBase<A, B>
public class TBaseImpl<B extends TFieldIdEnum> implements TBase<TBaseImpl, B>
このパターンの利点は、同じクラスの別のインスタンスを取り込むことを意図したメソッドのパラメータを制限できることです。たとえば、
public void example(T other)
これは(Javaで)奇妙に繰り返すテンプレートパターンです。
通常、実装/オーバーライドメソッドは、パラメータータイプとパラメーターの順序を正確に一致させる必要があります。ただし、このパターンでは、型パラメーターを絞り込むことで型を絞り込むことができます。たとえばTBaseImpl
、この場合のこのようなメソッドは、aのみを取りTBaseImpl
、より広いT
or は取りませんTBase
。このようなクラスでは、クラスとそれ自体の間に関係があります。
もう1つの利点は、メソッドが連鎖this
することです。
obj.method1().method2().method3()
このようにして、メソッドの連鎖を宣言してreturnを返すことができます。T
たとえば、TBase<TBaseImpl>
変数がこれらのメソッドを呼び出し、それぞれTBaseImpl
が別のメソッドを呼び出すことができるを返すことができます。
T method1(); // in TBase
@Override
TBaseImpl method1(); // in TBaseImpl
ちなみに、列挙型のサブタイプである型変数を宣言しようとしている場合、enum
isはfinal
拡張できないため、その必要はありません。F
インターフェースで削除し、実装クラスで列挙型を直接使用する方が簡単です。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加