Javaの再帰インターフェース型パラメーター

Jal:

私はこの再帰的なinterface定義をapache thriftソースコード理解しようとしています

 public interface TBase<T extends TBase<?, ?>, F extends TFieldIdEnum> extends Comparable<T>, Serializable {

私の理解から、TBase型パラメーターTを含むインターフェイスFです。

TTBase任意の型を含む型パラメーターを持つ拡張する必要があるという制約があります

私が混乱しているのは、終了するものです TBase

私が持っていると言います

public class TBaseImpl<A, B> implements TBase<A, B>

A でなければなりません TBase

したがって、別のクラス実装が必要です A

public class TBaseImplA<C, D> implements TBase<C, D>

しかしCTBase

したがって、別のクラス実装が必要です C

これは永遠に続きます。

だから私の質問は

  1. 終了条件とは TBase
  2. この再帰的な定義の利点は何ですか?

誰かが私に方向を示すことができますか?

ありがとう

rgettman:

そのため、Aを実装する別のクラスが必要です

それは必ずしも本当ではありません。このタイプの再帰境界では、サブタイプを作成するときに制約を満たすための2つの方法があります。

  1. 同じまたはより制限の厳しい境界を持つ独自の型パラメーターを宣言します。これにより、このクラスのユーザーにtypeパラメータを選択する負担がかかります。
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>
  1. 元の境界を満たすために定義しているものと同じクラスを渡します。
public class TBaseImpl<B extends TFieldIdEnum> implements TBase<TBaseImpl, B>

このパターンの利点は、同じクラスの別のインスタンスを取り込むことを意図したメソッドのパラメータを制限できることです。たとえば、

public void example(T other)

これは(Javaで)奇妙に繰り返すテンプレートパターンです。

通常、実装/オーバーライドメソッドは、パラメータータイプとパラメーターの順序を正確に一致させる必要があります。ただし、このパターンでは、型パラメーターを絞り込むことで型を絞り込むことができます。たとえばTBaseImpl、この場合のこのようなメソッドは、aのみを取りTBaseImpl、より広いTor 取りませんTBaseこのようなクラスでは、クラスとそれ自体の間に関係があります。

もう1つの利点は、メソッドが連鎖thisすることです。

obj.method1().method2().method3()

このようにして、メソッドの連鎖を宣言してreturnを返すことができます。Tたとえば、TBase<TBaseImpl>変数がこれらのメソッドを呼び出し、それぞれTBaseImplが別のメソッドを呼び出すことができるを返すことができます。

T method1();  // in TBase

@Override
TBaseImpl method1(); // in TBaseImpl

ちなみに、列挙型のサブタイプである型変数を宣言しようとしている場合、enumisはfinal拡張できないため、その必要ありません。Fインターフェースで削除し、実装クラスで列挙型を直接使用する方が簡単です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#の再帰的なジェネリック型パラメーター

分類Dev

再帰的JSONでのTypescriptインターフェースの使用

分類Dev

単純な古い再帰データ型のインターフェースの実装

分類Dev

kotlinの再帰型パラメーター

分類Dev

Javaインターフェイスでのパラメータ名の保持

分類Dev

Java:型パラメーターはインターフェースを実装する必要があります

分類Dev

メソッドのJavaインターフェース型宣言

分類Dev

Scala:型パラメーターなしでscalaの「型付き」クラスを含むJavaインターフェースを実装する方法

分類Dev

基本クラスのインターフェースに型パラメータを渡す

分類Dev

Jekyll再帰的動的インクルードパラメーター

分類Dev

ジェネリックベースインターフェイスのインスタンスから型パラメーターを取得する

分類Dev

Javaインターフェイスとパラメータタイプ

分類Dev

ほぼ周期的な型の範囲の再帰型パラメーター

分類Dev

インターフェースクラスをJavaのパラメーターとして渡す

分類Dev

Javaパラメータジェネリックインターフェイス

分類Dev

JAVAメソッドのパラメーターとインターフェース

分類Dev

パラメータ化されたインターフェイスを実装する型のKotlin Pass

分類Dev

Java-戻りの型が独自のメソッドパラメータ型にジェネリックを使用する場合の拡張インターフェースの戻りの型のオーバーライド

分類Dev

テンプレートメタプログラミングでの末尾再帰のパフォーマンス

分類Dev

Golangのスタブインターフェイスポインターパラメーター

分類Dev

Javaのメソッドパラメータとしてのインターフェース

分類Dev

Haskell:再帰データ型(パラメーター化された型)

分類Dev

Javaオプションのパラメーター化されたインターフェイス

分類Dev

インターフェイスパラメータnull

分類Dev

TypeScript :(再帰的)プロパティのタイプに応じたインターフェイス

分類Dev

参照によるインターフェース{}パラメータの設定

分類Dev

有界型パラメータまたは型インターフェイスを直接使用する場合

分類Dev

値型インターフェースの共分散エラー

分類Dev

Java 8機能インターフェース(コンシューマー)追加パラメーター

Related 関連記事

  1. 1

    C#の再帰的なジェネリック型パラメーター

  2. 2

    再帰的JSONでのTypescriptインターフェースの使用

  3. 3

    単純な古い再帰データ型のインターフェースの実装

  4. 4

    kotlinの再帰型パラメーター

  5. 5

    Javaインターフェイスでのパラメータ名の保持

  6. 6

    Java:型パラメーターはインターフェースを実装する必要があります

  7. 7

    メソッドのJavaインターフェース型宣言

  8. 8

    Scala:型パラメーターなしでscalaの「型付き」クラスを含むJavaインターフェースを実装する方法

  9. 9

    基本クラスのインターフェースに型パラメータを渡す

  10. 10

    Jekyll再帰的動的インクルードパラメーター

  11. 11

    ジェネリックベースインターフェイスのインスタンスから型パラメーターを取得する

  12. 12

    Javaインターフェイスとパラメータタイプ

  13. 13

    ほぼ周期的な型の範囲の再帰型パラメーター

  14. 14

    インターフェースクラスをJavaのパラメーターとして渡す

  15. 15

    Javaパラメータジェネリックインターフェイス

  16. 16

    JAVAメソッドのパラメーターとインターフェース

  17. 17

    パラメータ化されたインターフェイスを実装する型のKotlin Pass

  18. 18

    Java-戻りの型が独自のメソッドパラメータ型にジェネリックを使用する場合の拡張インターフェースの戻りの型のオーバーライド

  19. 19

    テンプレートメタプログラミングでの末尾再帰のパフォーマンス

  20. 20

    Golangのスタブインターフェイスポインターパラメーター

  21. 21

    Javaのメソッドパラメータとしてのインターフェース

  22. 22

    Haskell:再帰データ型(パラメーター化された型)

  23. 23

    Javaオプションのパラメーター化されたインターフェイス

  24. 24

    インターフェイスパラメータnull

  25. 25

    TypeScript :(再帰的)プロパティのタイプに応じたインターフェイス

  26. 26

    参照によるインターフェース{}パラメータの設定

  27. 27

    有界型パラメータまたは型インターフェイスを直接使用する場合

  28. 28

    値型インターフェースの共分散エラー

  29. 29

    Java 8機能インターフェース(コンシューマー)追加パラメーター

ホットタグ

アーカイブ