泛型中的上下界限定符:extends
和 super
的区别
作为一名编程博客专家,我将带领大家深入探讨泛型中的上下界限定符 extends
和 super
,这两个关键字在 Java 泛型编程中扮演着至关重要的角色。本文将详细解释它们的含义、用途以及如何在实际编程中应用它们。
前置知识
在深入探讨之前,我们需要了解一些基本概念:
- 泛型(Generics):泛型是 Java 语言的一项特性,允许你在定义类、接口和方法时使用类型参数。这使得代码更加通用和类型安全。
- 类型参数(Type Parameter):类型参数是泛型中的占位符,用于表示实际类型。
- 继承(Inheritance):在 Java 中,一个类可以继承另一个类,从而获得父类的属性和方法。
- 子类型(Subtype):如果类 B 继承自类 A,那么 B 是 A 的子类型。
上下界限定符详解
1. extends
(上界限定符)
extends
关键字用于指定类型参数的上界,表示类型参数必须是某个类的子类型或实现某个接口。
语法:
<T extends UpperBound>
示例代码:
public class Box<T extends Number> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
解释:
Box<T extends Number>
表示T
必须是Number
或Number
的子类(如Integer
、Double
等)。setContent
方法接受一个T
类型的参数,并将其存储在content
变量中。getContent
方法返回T
类型的值。
使用示例:
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
Integer content = integerBox.getContent();
System.out.println(content); // 输出: 123
// 下面的代码会编译错误,因为 String 不是 Number 的子类
// Box<String> stringBox = new Box<>();
2. super
(下界限定符)
super
关键字用于指定类型参数的下界,表示类型参数必须是某个类的父类型。
语法:
<T super LowerBound>
示例代码:
public class Consumer<T> {
public void consume(List<? super T> list, T item) {
list.add(item);
}
}
解释:
consume
方法接受一个List<? super T>
类型的参数,表示列表中的元素类型必须是T
或T
的父类型。list.add(item)
将T
类型的item
添加到列表中。
使用示例:
List<Object> objectList = new ArrayList<>();
Consumer<String> stringConsumer = new Consumer<>();
stringConsumer.consume(objectList, "Hello");
System.out.println(objectList); // 输出: [Hello]
实际应用场景
1. 使用 extends
实现类型安全的集合操作
假设我们有一个方法,需要计算一个数字列表的总和:
public static double sumOfList(List<? extends Number> list) {
double sum = 0.0;
for (Number num : list) {
sum += num.doubleValue();
}
return sum;
}
解释:
sumOfList
方法接受一个List<? extends Number>
类型的参数,表示列表中的元素类型必须是Number
或Number
的子类型。- 使用
Number
类型的doubleValue
方法将每个元素转换为double
类型并累加。
使用示例:
List<Integer> integerList = Arrays.asList(1, 2, 3, 4, 5);
double sum = sumOfList(integerList);
System.out.println(sum); // 输出: 15.0
2. 使用 super
实现类型安全的添加操作
假设我们有一个方法,需要将一个元素添加到列表中:
public static <T> void addToList(List<? super T> list, T item) {
list.add(item);
}
解释:
addToList
方法接受一个List<? super T>
类型的参数,表示列表中的元素类型必须是T
或T
的父类型。list.add(item)
将T
类型的item
添加到列表中。
使用示例:
List<Object> objectList = new ArrayList<>();
addToList(objectList, "Hello");
addToList(objectList, 123);
System.out.println(objectList); // 输出: [Hello, 123]
总结
通过本文的讲解,我们详细了解了泛型中的上下界限定符 extends
和 super
。extends
用于指定类型参数的上界,表示类型参数必须是某个类的子类型或实现某个接口;super
用于指定类型参数的下界,表示类型参数必须是某个类的父类型。这些限定符在实际编程中非常有用,能够提高代码的类型安全性和灵活性。
希望本文能够帮助你更好地理解和应用泛型中的上下界限定符。如果你有任何问题或需要进一步的解释,请随时提问。编程愉快!