import java.util.Collection;
public class GenericExample {
// ワイルドカードを使用したジェネリクスメソッド
public static void printElements(Collection<?> collection) {
for (Object element : collection) {
System.out.println(element);
}
}
public static void main(String[] args) {
// 整数型のリスト
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(2);
integerList.add(3);
// 文字列型のリスト
List<String> stringList = new ArrayList<>();
stringList.add("One");
stringList.add("Two");
stringList.add("Three");
// 任意の型のセット
Set<Double> doubleSet = new HashSet<>();
doubleSet.add(1.1);
doubleSet.add(2.2);
doubleSet.add(3.3);
// ワイルドカードを使用したメソッドを呼び出して要素を出力
printElements(integerList);
printElements(stringList);
printElements(doubleSet);
}
}
この例では、printElements
メソッドがワイルドカードを使用して任意のジェネリクスコレクションを受け取り、要素を順番に出力します。main
メソッドでは、整数型のリスト、文字列型のリスト、および任意の型のセットの要素を printElements
メソッドを使用してそれぞれ出力しています。
ワイルドカード
ワイルドカード(Wildcards)は、Javaにおいてジェネリクスを使用する際に、型の柔軟性を提供するための特殊な機能です。主に3つの種類があります:、、。
<?>(非境界ワイルドカード):
未知の型にマッチします。
例えば、Listはどんな型の要素でも受け入れることができます。
メソッドの引数に使われることがあり、任意の型のコレクションを受け入れる柔軟性を提供します。
public static void printElements(Collection<?> collection) {
for (Object element : collection) {
System.out.println(element);
}
}
<? extends T>(上限境界ワイルドカード):
T または T のサブクラスにマッチします。
例えば、ListはNumberまたはそのサブクラスの要素を受け入れます。
読み取り専用の場合に使用されることがあります。
public static double sum(List<? extends Number> numbers) {
double total = 0.0;
for (Number number : numbers) {
total += number.doubleValue();
}
return total;
}
<? super T>(下限境界ワイルドカード):
T または T のスーパークラスにマッチします。
例えば、ListはIntegerまたはそのスーパークラスの要素を受け入れます。
書き込み専用の場合に使用されることがあります。
public static void addNumbers(List<? super Integer> numbers) {
numbers.add(1);
numbers.add(2);
numbers.add(3);
}
ワイルドカードを使用することで、ジェネリクスのコードがより柔軟になり、異なる型のコレクションを同じメソッドで扱えるようになります。