はじめに
Javaの境界ワイルドカードについてまとめてみた。
主に3つの形式がある。
・非境界ワイルドカード
・上限境界ワイルドカード
・下限境界ワイルドカード
非境界ワイルドカード
<?>
のようにジェネリクス宣言時にワイルドカード「?」を使用することで型パラメータとして使用できるクラスを制限せずに扱うことができる。主に2つの特徴がある。
・メソッドの戻り値の型はObject型になる。
・メソッドの引数にはnullリテラルのみ渡せる。
Main.java
public class Main {
public static void main(String[] args) throws Exception {
// 非境界ワイルドカードを使用しリストを宣言
ArrayList<?> list = new ArrayList<>();
ArrayList<String> strList = new ArrayList<>();
ArrayList<Integer> intList = new ArrayList<>();
list.containsAll(strList);
list.containsAll(intList);
}
}
上限境界ワイルドカード
<? extends T>
のようにジェネリクス宣言時に「extends」を使い、型パラメータとして使用できるクラスの範囲を制限する仕組みである。
<? extends T>
の場合、TまたはTのサブクラス型のみ扱うことができる。
・メソッドの戻り値は任意の型にすることができる。
・メソッドの引数にはnullリテラルのみ渡せる。
Main.java
public class Main {
public static void main(String[] args) throws Exception {
ArrayList<Integer> intList = new ArrayList<>();
ArrayList<String> strList = new ArrayList<>();
// IntegerはNumberのサブクラスのため呼び出すことができる
testList(intList);
// StringはNumberのサブクラスではないためコンパイルエラー
testList(strList);
}
// 上限境界ワイルドカードを使用したメソッド
public static void testList(List<? extends Number> list) {
// listに関する処理
}
}
下限境界ワイルドカード
<? super T>
のようにジェネリクス宣言時に「super」を使い、型パラメータとして使用できるクラスの範囲を制限する仕組みである。
<? super T>
の場合、TまたはTのスーパークラス型のみ扱うことができる。
・メソッドの戻り値の型はObject型になる。
・メソッドの引数には任意の型を渡せる。
Main.java
public class Main {
public static void main(String[] args) throws Exception {
ArrayList<Number> numList = new ArrayList<>();
ArrayList<String> strList = new ArrayList<>();
// NumberはIntegerのスーパークラスのため呼び出すことができる
testList(numList);
// StringはIntegerのスーパークラスではないためコンパイルエラー
testList(strList);
}
// 下限境界ワイルドカードを使用したメソッド
public static void testList(List<? super Integer> list) {
// listに関する処理
}
}