泛型上下限的基本概念
-
extends
:- 用于指定泛型的上限,即泛型类型必须是指定类型的子类型或者是指定类型本身。
- 通常用于限定泛型的类型参数,保证泛型类型不超过指定的类型。
-
super
:- 用于指定泛型的下限,即泛型类型必须是指定类型的父类型或者是指定类型本身。
- 通常用于限定泛型的类型参数,保证泛型类型不会低于指定的类型。
详细说明
1. extends
关键字
-
定义:
T extends Bound
表示泛型T
是Bound
类型或其子类型。可以指定多个上限,用&
分隔,但其中一个上限必须是Object
。 -
示例:
class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }
// 定义一个方法,该方法可以接收Dog和Cat对象
public <T extends Animal> void addAnimal(T animal) {
// 这里你可以使用animal作为Animal类型
}
// 使用示例
addAnimal(new Dog()); // 合法
addAnimal(new Cat()); // 合法
-
作用: 使用
extends
来限制泛型类型,使其能够接受Animal
及其子类。这确保了在调用addAnimal
方法时,传入的对象是Animal
的实例或其子类的实例。
2. super
关键字
-
定义:
T super Bound
表示泛型T
是Bound
类型或其父类型。可以用来指定类型的最小界限,保证泛型类型至少是Bound
类型。 -
示例:
class Animal { }
class Dog extends Animal { }
class Cat extends Animal { }
// 定义一个方法,该方法可以接收Animal及其父类对象
public void addAnimal(List<? super Dog> list) {
list.add(new Dog()); // 合法
// list.add(new Cat()); // 编译错误,因为Cat不是Dog的超类
}
// 使用示例
List<Animal> animalList = new ArrayList<>();
addAnimal(animalList); // 合法
-
作用: 使用
super
来确保集合的元素类型至少是Dog
的超类,这样可以安全地添加Dog
对象到集合中。注意,不能添加Dog
以外的其他子类型,比如Cat
。
总结
-
extends
限定了泛型类型必须是某个指定类型的子类或该类型本身。用于读操作,确保泛型类型符合上界的要求。 -
super
限定了泛型类型必须是某个指定类型的父类或该类型本身。用于写操作,确保泛型类型不低于下界的要求。
这两种用法帮助你在编写泛型代码时能够更好地控制类型的范围,确保代码的类型安全和灵活性。