在Java中,泛型(Generics)是JDK 5引入的一个关键特性,它提供了编译时类型安全检测机制,允许程序员在编译时期检测到非法的类型。泛型的使用极大地增强了Java集合框架的灵活性和类型安全性。泛型的上下界限定符(Bounds)是泛型编程中一个重要的概念,它允许我们为泛型类型参数指定一个范围,即类型参数必须是某个类型或其子类型(下界),或者某个类型或其超类型(上界)。这种机制使得泛型的使用更加灵活且安全。
上界限定符(Upper Bounded Wildcards)
上界限定符使用extends
关键字(注意这里的extends
并不限于类继承,还包括接口实现),用于指定泛型类型参数的上限。这意呀着泛型类型参数可以是某个特定类型或者该类型的任何子类型。这种特性常用于限制通配符类型(Wildcard Types),使得方法可以接受更加广泛的参数类型,同时保持类型安全。
示例代码:
假设我们有一个Animal
接口和两个实现类Dog
和Cat
,我们想要编写一个方法,该方法可以接收一个List<Animal>
或任何Animal
子类型的列表,并打印出列表中的元素。
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<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
List<Cat> cats = new ArrayList<>();
cats.add(new Cat());
// 由于上界限定符,以下调用都是合法的
printAnimalList(dogs);
printAnimalList(cats);
List<Animal> 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
类型的对象。
// 注意:实际上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<Animal> animals = new ArrayList<>();
addToAnimalList(animals); // 合法,因为animals是Animal或其父类型的列表
// List<Object> objects = new ArrayList<>();
// addToAnimalList(objects); // 如果取消注释,这将是非法的,因为Object不是Animal的子类型
}
}
在这两个示例中,我们展示了如何在Java中使用泛型的上下界限定符来增强代码的灵活性和类型安全性。通过合理使用这些特性,可以编写出既强大又易于维护的Java程序。同时,通过将这些概念与实际的编程实践相结合,可以帮助程序员更深入地理解Java泛型的工作原理和强大功能。在“码小课”网站上,你可以找到更多关于Java泛型及其高级特性的深入讲解和实战案例。