寒假打卡08-1月21日
Java 泛型通配符——? extends T 与 ? super T 的区别
在 Java 泛型中,通配符(Wildcard)是一种表示不确定类型的符号,使用问号 ? 来表示。通配符可以用来表示各种类型的集合或容器。在实际编程中,常用的通配符有两种:? extends T 和 ? super T。它们分别表示类型的上边界和下边界。
类型通配符
无界通配符
无界通配符 ? 表示可以接受任何类型。它常用于泛型方法和泛型类,以表示可以操作任意类型的集合或容器。
示例代码
下面是一个使用无界通配符的示例,展示了如何定义和使用无界通配符:
import java.util.ArrayList;
import java.util.List;
public class UnboundedWildcardDemo {
public static void printList(List<?> list) {
for (Object element : list) {
System.out.print(element + " ");
}
System.out.println();
}
public static void main(String[] args) {
List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
intList.add(3);
List<String> strList = new ArrayList<>();
strList.add("Hello");
strList.add("World");
printList(intList);
printList(strList);
}
}
在上述代码中,printList(List<?> list) 方法可以接受任何类型的 List,如 Integer 列表和 String 列表。
上界通配符(? extends T)
上界通配符 ? extends T 表示可以接受 T 类型及其子类的类型。它常用于返回类型是 T 的泛型方法和泛型类,以确保类型的安全性。
示例代码
下面是一个使用上界通配符的示例,展示了如何定义和使用上界通配符:
import java.util.ArrayList;
import java.util.List;
public class UpperBoundedWildcardDemo {
public static void printNumbers(List<? extends Number> list) {
for (Number number : list) {
System.out.print(number + " ");
}
System.out.println();
}
public static void main(String[] args) {
List<Integer> intList = new ArrayList<>();
intList.add(1);
intList.add(2);
intList.add(3);
List<Double> doubleList = new ArrayList<>();
doubleList.add(1.1);
doubleList.add(2.2);
doubleList.add(3.3);
printNumbers(intList);
printNumbers(doubleList);
}
}
在上述代码中,printNumbers(List<? extends Number> list) 方法可以接受 Number 类型及其子类的 List,如 Integer 列表和 Double 列表。
下界通配符(? super T)
下界通配符 ? super T 表示可以接受 T 类型及其超类的类型。它常用于将 T 类型的对象添加到集合或容器中,以确保类型的安全性。
示例代码
下面是一个使用下界通配符的示例,展示了如何定义和使用下界通配符:
import java.util.ArrayList;
import java.util.List;
public class LowerBoundedWildcardDemo {
public static void addNumbers(List<? super Integer> list) {
list.add(1);
list.add(2);
list.add(3);
}
public static void main(String[] args) {
List<Number> numberList = new ArrayList<>();
addNumbers(numberList);
List<Object> objectList = new ArrayList<>();
addNumbers(objectList);
System.out.println("Number list: " + numberList);
System.out.println("Object list: " + objectList);
}
}
在上述代码中,addNumbers(List<? super Integer> list) 方法可以接受 Integer 类型及其超类的 List,如 Number 列表和 Object 列表。
上界通配符与下界通配符的区别
上界通配符(? extends T)
- 上界通配符表示可以接受
T类型及其子类的类型。 - 常用于返回类型是
T的泛型方法和泛型类,以确保类型的安全性。 - 适用于读取操作,但不适合写入操作。
下界通配符(? super T)
- 下界通配符表示可以接受
T类型及其超类的类型。 - 常用于将
T类型的对象添加到集合或容器中,以确保类型的安全性。 - 适用于写入操作,但不适合读取操作。
示例对比
import java.util.ArrayList;
import java.util.List;
public class WildcardComparison {
public static void main(String[] args) {
List<? extends Number> upperBoundedList = new ArrayList<>();
// upperBoundedList.add(1); // 编译错误,无法添加元素
Number num = upperBoundedList.get(0); // 可以读取元素
List<? super Integer> lowerBoundedList = new ArrayList<>();
lowerBoundedList.add(1); // 可以添加元素
// Integer value = lowerBoundedList.get(0); // 编译错误,无法读取元素
}
}
在上述代码中,我们可以看到上界通配符适用于读取操作,而下界通配符适用于写入操作。
总结
Java 泛型通配符 ? extends T 和 ? super T 是非常有用的工具,它们可以帮助我们编写更灵活和类型安全的代码。上界通配符表示可以接受 T 类型及其子类的类型,适用于读取操作;下界通配符表示可以接受 T 类型及其超类的类型,适用于写入操作。
希望通过本篇文章,大家对 Java 泛型通配符有了更深入的了解。在接下来的文章中,我们将继续探讨更多关于 Java 泛型的知识点,敬请期待!
浙公网安备 33010602011771号