ジェネリック型

ジェネリック型は、型に対してパラメーター化された汎用クラスまたはインターフェースです。次のBoxクラスは、概念を示すために変更されます。

単純なBoxクラス

まず、任意のタイプのオブジェクトを操作する非ジェネリックBoxクラスを調べます。ボックスにオブジェクトを追加するsetと、オブジェクトを取得するgetの2つのメソッドを提供するだけで済みます。

そのメソッドはオブジェクトを受け入れるか返すので、自由に渡すことができます。 、プリミティブ型の1つではない場合。コンパイル時に、クラスがどのように使用されているかを確認する方法はありません。コードの一部がボックスに整数を配置し、そこから整数を取得することを期待している一方で、コードの別の部分が誤って文字列を渡し、ランタイムエラーが発生する可能性があります。

汎用バージョンボックスクラスの概要

ジェネリッククラスは次の形式で定義されます:

class name<T1, T2, ..., Tn> { /* ... */ }

更新するにはジェネリックを使用するボックスクラス。コード「publicclassBox」を「publicclassBox < T > “。これにより、クラス内のどこでも使用できる型変数Tが導入されます。

この変更により、Boxクラスは次のようになります。

ご覧のとおり、Objectのすべてのオカレンスは型変数は、指定した任意の非プリミティブ型にすることができます。任意のクラス型、任意のインターフェイス型、任意の配列型、または別の型変数です。

これと同じ手法を適用して作成できます。汎用インターフェース。

型パラメーターの命名規則

慣例により、型パラメーター名は単一の大文字です。これは、すでに知っている変数の命名規則とはまったく対照的であり、正当な理由があります。この規則がないと、型変数と通常のクラスまたはインターフェイス名の違いを区別するのが困難になります。

最も一般的に使用される型パラメーター名は次のとおりです。

  • E-要素(Javaコレクションフレームワークで広く使用されています)
  • K-キー
  • N-番号
  • T-タイプ
  • V-値
  • S、U、Vなど-2番目、3番目、4番目のタイプ

これらの名前は、Java SEAPIおよびこのレッスンの残りの部分で使用されます。

汎用型の呼び出しとインスタンス化

汎用Boxクラスを参照するにはコード内から、ジェネリック型の呼び出しを実行する必要があります。これにより、Tが整数などの具体的な値に置き換えられます。

Box<Integer> integerBox;

ジェネリック型の呼び出しは、通常のメソッドの呼び出しに似ていると考えることができますが、引数をamに渡す代わりにethodでは、型引数(この場合は整数)をBoxクラス自体に渡します。

型パラメーターと型引数の用語:多くの開発者は、「型パラメーター」と「型引数」という用語を同じ意味で使用しています。しかし、これらの用語は同じではありません。コーディングするとき、パラメータ化された型を作成するために型引数を提供します。したがって、FooのT < T >はタイプパラメータであり、Fooの文字列< String > fは型引数です。このレッスンでは、これらの用語を使用するときにこの定義を順守します。

他の変数宣言と同様に、このコードは実際には新しいBoxオブジェクトを作成しません。 integerBoxが「BoxofInteger」への参照を保持することを宣言するだけです。これにより、Box < Integer >が読み取られます。

ジェネリック型の呼び出しは、一般にパラメーター化型と呼ばれます。

このクラスをインスタンス化するには、通常どおりnewキーワードを使用しますが、<クラス名と括弧の間の整数>:

Box<Integer> integerBox = new Box<Integer>();

ダイアモンド

Java SE 7以降では、汎用クラスのコンストラクターを呼び出すために必要な型引数を、空の型引数のセット(< >)コンパイラーがコンテキストから型引数を判別または推測できる限り、この山かっこのペア< >は、非公式にひし形と呼ばれます。たとえば、次のステートメントを使用して、Box < Integer >のインスタンスを作成できます。

Box<Integer> integerBox = new Box<>();

ダイヤモンド表記と型推論の詳細については、型推論を参照してください。

複数の型パラメーター

前述のとおり、ジェネリッククラスは、複数の型パラメーターを持つことができます。たとえば、汎用のPairインターフェイスを実装する汎用のOrderedPairクラス:

次のステートメントは、OrderedPairクラスの2つのインスタンス化を作成します。

コード、new OrderedPair < String、Integer >は、Kを文字列として、Vを整数としてインスタンス化します。 したがって、OrderedPairのコンストラクターのパラメータータイプは、それぞれStringとIntegerです。自動ボックス化により、Stringとintをクラスに渡すことが有効です。

The Diamondで説明したように、 Javaコンパイラーは、宣言OrderedPair < String、Integer >からK型とV型を推測できます。これらのステートメントは、ダイヤモンド表記を使用して短縮できます。

OrderedPair<String, Integer> p1 = new OrderedPair<>("Even", 8);OrderedPair<String, String> p2 = new OrderedPair<>("hello", "world");

汎用インターフェースを作成するには、汎用クラスを作成する場合と同じ規則に従います。

パラメータ化されたタイプ

OrderedPair<String, Box<Integer>> p = new OrderedPair<>("primes", new Box<Integer>(...));

Write a Comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です