? extends T
2025-09-01 本文已影响0人
flyjar
在Java泛型中,? extends T 表示上界通配符(Upper Bounded Wildcard),用于限制泛型类型的范围。
它的含义是:匹配所有T类型及其子类类型。
具体来说,当你看到 ? extends T 时,表示这个泛型参数可以是:
- T类型本身
- T的任意直接子类
- T的任意间接子类
举个例子:
// 定义一个父类
class Animal {}
// 定义子类
class Dog extends Animal {}
class Cat extends Animal {}
// 使用上界通配符
List<? extends Animal> list;
// 以下赋值都是合法的
list = new ArrayList<Animal>(); // T本身
list = new ArrayList<Dog>(); // T的子类
list = new ArrayList<Cat>(); // T的另一个子类
使用场景与限制:
- 主要用于读取操作,可以安全地从集合中获取T类型的元素
- 不能向集合中添加元素(除了null),因为编译器无法确定集合实际存储的是哪种T的子类
例如:
List<? extends Animal> animals = new ArrayList<Dog>();
animals.add(new Dog()); // 编译错误!
animals.add(null); // 唯一允许的添加操作
Animal a = animals.get(0); // 合法,可以安全获取Animal类型
这种通配符的核心作用是提高泛型的灵活性,允许方法接收更广泛的类型参数,同时保证类型安全。