public class GenericExample {
// 1. ジェネリクスメソッド printElements の宣言
public static <T> void printElements(List<T> list) {
// リストの要素を順番に表示
for (T element : list) {
System.out.println(element);
}
}
public static void main(String[] args) {
// 2. printElements メソッドを使用して要素を表示
// 文字列型のリスト
List<String> stringList = Arrays.asList("Apple", "Banana", "Orange");
System.out.println("String List:");
printElements(stringList);
// 整数型のリスト
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
System.out.println("\nInteger List:");
printElements(integerList);
// 任意の型のリストも表示可能
List<Double> doubleList = Arrays.asList(1.5, 2.5, 3.5);
System.out.println("\nDouble List:");
printElements(doubleList);
}
}
この例では、printElements
メソッドが任意の型のリストを受け取り、その要素を順番に表示する役割を果たしています。<T>
はジェネリクスを表し、List<T>
は任意の型 T
のリストを指定しています。printElements
メソッド内で拡張for文を使用して、リストの要素を順番に表示しています。 main
メソッドでは、異なる型のリストを作成して printElements
メソッドを呼び出しています。
ワイルドカードの非境界
ワイルドカードには、境界がないワイルドカード(unbounded wildcard)があります。これは、<?>
と表され、あらゆる型のオブジェクトを受け入れることができます。以下に、ワイルドカードの非境界の使用例と解説を示します。
ワイルドカードの非境界の使用例
import java.util.ArrayList;
import java.util.List;
public class WildcardExample {
// 1. ワイルドカードの非境界を使用したメソッド
public static void printElements(List<?> list) {
for (Object element : list) {
System.out.println(element);
}
}
public static void main(String[] args) {
// 2. ワイルドカードの非境界を使用して要素を表示
// 文字列型のリスト
List<String> stringList = new ArrayList<>();
stringList.add("Apple");
stringList.add("Banana");
stringList.add("Orange");
System.out.println("String List:");
printElements(stringList);
// 整数型のリスト
List<Integer> integerList = new ArrayList<>();
integerList.add(1);
integerList.add(2);
integerList.add(3);
System.out.println("\nInteger List:");
printElements(integerList);
}
}
解説
printElements
メソッドでは、ワイルドカードの非境界List<?>
を使用しています。これにより、どの型のリストでも受け入れることができます。main
メソッドでは、文字列型のリストと整数型のリストを作成し、それぞれprintElements
メソッドに渡しています。ワイルドカードが非境界であるため、異なる型のリストを同じメソッドに渡すことができます。
ワイルドカードの非境界は、Javaにおいて柔軟性と再利用性を提供する重要な概念です。この概念を理解することで、異なる型のコレクションやジェネリクス型を扱う際に、より汎用的で拡張可能なコードを記述することができます。
非境界ワイルドカード (<?>
) を使用することで、特定の型に依存しないメソッドやクラスを実装でき、その結果、コードの再利用性が向上します。異なる型を扱う場面で、型に関する柔軟性が求められる際には、非境界ワイルドカードが非常に役立ちます。
ただし、注意が必要であり、非境界ワイルドカードを使用することで型安全性が低下する可能性があるため、コードを慎重に設計することが重要です。状況によっては、境界付きワイルドカードや具象型の使用が適切な場合もあります。
ワイルドカードの理解と適切な使用は、Javaプログラミングにおいて洗練されたコードを書くための一環となります。