在 Java 中,泛型通配符(?
)用于表示未知類型,通常用于增強泛型的靈活性。通配符可以與上下限結合使用,以限制泛型的范圍。以下是通配符及上下限的使用示例:
1. 無界通配符 (?
)
無界通配符表示可以接受任意類型的泛型參數。
public static void printList(List<?> list) {for (Object element : list) {System.out.println(element);}
}
- 示例調用:
List<Integer> intList = Arrays.asList(1, 2, 3); List<String> stringList = Arrays.asList("Hello", "World"); printList(intList); // 輸出: 1 2 3 printList(stringList); // 輸出: Hello World
2. 上界通配符 (<? extends T>
)
上界通配符表示泛型類型必須是 T
或其子類。
public static double sumOfList(List<? extends Number> list) {double sum = 0.0;for (Number number : list) {sum += number.doubleValue();}return sum;
}
- 示例調用:
List<Integer> intList = Arrays.asList(1, 2, 3); List<Double> doubleList = Arrays.asList(1.1, 2.2, 3.3); System.out.println(sumOfList(intList)); // 輸出: 6.0 System.out.println(sumOfList(doubleList)); // 輸出: 6.6
3. 下界通配符 (<? super T>
)
下界通配符表示泛型類型必須是 T
或其父類。
public static void addNumbers(List<? super Integer> list) {list.add(1);list.add(2);list.add(3);
}
- 示例調用:
List<Number> numberList = new ArrayList<>(); addNumbers(numberList); System.out.println(numberList); // 輸出: [1, 2, 3]
4. 上下限通配符的綜合使用
上下限通配符通常用于泛型類或方法中,以限制泛型類型的范圍。
public static <T> void copy(List<? extends T> src, List<? super T> dest) {for (T item : src) {dest.add(item);}
}
- 示例調用:
List<Integer> srcList = Arrays.asList(1, 2, 3); List<Number> destList = new ArrayList<>(); copy(srcList, destList); System.out.println(destList); // 輸出: [1, 2, 3]
總結:
?
:無界通配符,接受任意類型。<? extends T>
:上界通配符,限制為T
或其子類。<? super T>
:下界通配符,限制為T
或其父類。
通過合理使用通配符和上下限,可以增強泛型的靈活性,同時保證類型安全。