概要
型パラメータとして受け取れる最も具体的な型(下限)を制限し、それ以上の型であれば扱うことができる。
下限境界ワイルドカードの表記は ? super Type
である。ここで、Type
は特定のクラス名やインターフェース名が入る。
上記のような型パラメータを与えると、非変であるジェネリクスの制限を緩和し、Type
に指定したクラスもしくはより上位の型であれば型パラメータとして受け取ることができる。
例
public void processElements(List<? super Integer> list) {
// Integerクラスまたはそのスーパータイプのリストを処理する
// 要素の追加も可能
list.add(42);
for (Object element : list) {
// 要素の処理
}
}
上記の例では、List<? super Integer>
型の引数を受け取る processElements
メソッドがある。これは、Integer
クラスまたはそのスーパータイプのリストを処理することができる。また、list
に対して新しい Integer
オブジェクトを追加することも可能である。
下限境界ワイルドカードは、特定のクラスのスーパータイプの柔軟な処理や、書き込み可能な操作を行う場合に有用である。
特徴
引数の型
上限境界ワイルドカードの場合、戻り値には任意の型を使うことができるが、引数にはnull
リテラルしか渡せない。
しかし、下限境界ワイルドカードであれば、引数の型に任意の型を使うことができる。
戻り値の型
一方で、戻り値の型はObject
型に限定される。
(取り出す時にフィールドにどの型の参照が入っているかわからないため、最も安全な全てのクラスであるObject
型にしている)
ワイルドカードのまとめ
以下3つのワイルドカードについて簡単にまとめる。
-
上限境界ワイルドカード
特定のクラス、サブクラスを制約する。 -
非境界ワイルドカード
任意の型を受け入れる柔軟性を持つ。 -
下限境界ワイルドカード
特定のクラス、スーパークラスを制約する。
これらのワイルドカードは、Javaのジェネリクスにおいて型の柔軟性を提供し、異なる型の互換性や再利用性を向上させるために使用される。