Java-非常に奥深く、ジェネリックは 1 つしか知りません
目次
-
一般的な歴史
- JAVA ジェネリックス (ジェネリクス) は JDK 5 で導入された新機能で、プログラマーがプログラミング時に型パラメーターを指定できるため、コードのコンパイル時にコンパイラーが不正な型を検出できます。ジェネリックの本質はパラメーター化された型です。これは、操作されるデータの型がパラメーターとして指定されることを意味します。
- JDK 7 以降では、ジェネリックを ArrayList<String> list = new ArrayList<>(); と省略することができます。
-
ジェネリッククラス/ジェネリックインターフェイス
- 一般に、T、E、K、V、N、R で表され、? はワイルドカード/プレースホルダー、慣例、および習慣を表します。もちろん、Javaの仕様に則った表現であればどのように表現しても構いません。
- E - 要素 (コレクションには要素が格納されるため、コレクションで使用されます)、列挙型 Enum
- T - タイプ (Java クラス)
- K - キー
- V - 値
- N - 数値 (数値型)
- 次の例では、クラス (インターフェイス) 名の後にジェネリック宣言 (例: <T> および <T1,T2,R>) が続きます。これは、このクラス (インターフェイス) 内のジェネリックの数を表します。現在のクラス (ジェネリック) 同時に使用できるデータ型の数。
- クラス(インターフェース)内に同じジェネリック宣言の属性、メソッドパラメータ、メソッド戻り値が出現する場合、それらは同じ型であることを意味します。
-
一般的なメソッド
- ジェネリック クラス (インターフェイス) で宣言されたジェネリックはジェネリック メソッドで直接使用できますが、宣言されていないジェネリックはメソッド上で個別に宣言する必要があります。
- クラス (インターフェイス) で宣言されたメソッドの繰り返し宣言は、データ ドメインの問題になります。
- 次の例では、汎用パラメーターと汎用戻り値を使用します。
-
汎用プロパティ
- クラス属性にジェネリックスを使用するには、クラス(インターフェイス)内で事前に宣言しておく必要があります。
- メソッド属性にジェネリックを使用するには、メソッドの前にジェネリックを宣言する必要があります。
- 次の例の GenericClazz クラスによって指定されるジェネリック型は Demo です。もちろん、任意の型にすることができます。ここでは参照クラスがデモンストレーションとして使用されています。
-
一般的な制約
- 次のビューには、Demo2 と GenericClazz の 2 つの参照データ型があり、Demo2 はGenericClazzを継承します。
- ?現在のタイプを示すプレースホルダー/ワイルドカードを示します。
- ArrayList<? extends GenericClazz>: パラメータ化された型が指定された GenericClazz 型、またはこの型の任意のサブタイプであることを示す上限を宣言します。
- ArrayList<? super Demo2>: 下限を宣言し、パラメーター化された型が指定された Demo2 型、またはこの型の任意の親型である可能性があることを示します。
- ? extends / ? super は一般的な共分散につながり、例の赤いエラー ポイントはすべてextends の一般的な共分散によって引き起こされます。
- extends:オブジェクトは読み取り可能ですが、書き込みはできません。
- super : オブジェクトは読み取りおよび書き込み可能です。