当前位置: 面试刷题>> 什么是 Java 泛型的上下界限定符?
在Java中,泛型(Generics)是JDK 5引入的一个关键特性,它提供了编译时类型安全检测机制,允许程序员在编译时期检测到非法的类型。泛型的使用极大地增强了Java集合框架的灵活性和类型安全性。泛型的上下界限定符(Bounds)是泛型编程中一个重要的概念,它允许我们为泛型类型参数指定一个范围,即类型参数必须是某个类型或其子类型(下界),或者某个类型或其超类型(上界)。这种机制使得泛型的使用更加灵活且安全。
### 上界限定符(Upper Bounded Wildcards)
上界限定符使用`extends`关键字(注意这里的`extends`并不限于类继承,还包括接口实现),用于指定泛型类型参数的上限。这意呀着泛型类型参数可以是某个特定类型或者该类型的任何子类型。这种特性常用于限制通配符类型(Wildcard Types),使得方法可以接受更加广泛的参数类型,同时保持类型安全。
**示例代码**:
假设我们有一个`Animal`接口和两个实现类`Dog`和`Cat`,我们想要编写一个方法,该方法可以接收一个`List`或任何`Animal`子类型的列表,并打印出列表中的元素。
```java
interface Animal {}
class Dog implements Animal {}
class Cat implements Animal {}
public class GenericBoundsDemo {
// 使用上界限定符
public static void printAnimalList(List extends Animal> animalList) {
for (Animal animal : animalList) {
System.out.println(animal); // 这里animal被隐式地视为Animal类型
}
}
public static void main(String[] args) {
List dogs = new ArrayList<>();
dogs.add(new Dog());
List cats = new ArrayList<>();
cats.add(new Cat());
// 由于上界限定符,以下调用都是合法的
printAnimalList(dogs);
printAnimalList(cats);
List animals = new ArrayList<>();
animals.add(new Dog());
animals.add(new Cat());
printAnimalList(animals);
}
}
```
### 下界限定符(Lower Bounded Wildcards)
下界限定符使用`super`关键字,与上界相反,它指定了泛型类型参数的下限。这意味着泛型类型参数可以是某个特定类型或者该类型的任何父类型(包括自身)。这种机制在处理需要从集合中写入元素时特别有用,因为它允许我们向集合中添加指定类型或其子类型的对象。
**示例代码**:
继续使用上述的`Animal`、`Dog`和`Cat`类,假设我们想要编写一个方法,该方法可以接收一个`List`,这个列表可以包含`Animal`或`Animal`的任何父类型(尽管在这个场景下`Animal`没有父类,但假设有一个),但主要是允许我们向这个列表中添加`Animal`类型的对象。
```java
// 注意:实际上Animal没有父类,这里仅用于演示下界限定符的使用
public class AddAnimalToListDemo {
// 使用下界限定符
public static void addToAnimalList(List super Animal> animalList) {
animalList.add(new Animal() { // 使用匿名内部类模拟Animal对象
// 实现Animal接口的方法
});
// 注意:我们不能直接假设animalList中的元素都是Animal类型,因此不能遍历它
}
public static void main(String[] args) {
List animals = new ArrayList<>();
addToAnimalList(animals); // 合法,因为animals是Animal或其父类型的列表
// List