PECS 即 producer extends, Consumer super
- 如果想要获取, 那么推荐使用
? extends T
- 如果想要存放, 那么推荐使用
? super T
@Test
public void testPecs() {
// 使用 ? extends Number 表示元素的上限是 Number
// 我们无法确定具体是哪种类型的元素可以存入
// 可以确定是取出的元素类型是兼容 Number 类型的
List<? extends Number> list = new ArrayList<>();
// 编译报错
// list.add(123);
// list.add(new Object());
list.add(null);
// 只能 get, get 的对象一定是 Number 或者 Number 的子类, 那么使用 Number 是类型兼容的, 所以编译不报错
Number number = list.get(0);
// 使用 ? super Number 表示元素的下限是 Number
// 我们不能确定取出元素的类型是 Number 或 Number 的哪个父类
// 我们可以确定的是存入的元素类型是兼容 Number 或者 Number 的子类
List<? super Number> list2 = new ArrayList<>();
// Number 或者 Number 的父类无法确定具体是哪个
// 添加元素时加入 Number 的子类, 一定是类型兼容的, 所以编译不报错
list2.add(100);
list2.add(100L);
list2.add(100.0d);
// 取出元素数据类型是 Object 类, 即所有对象的父类
Object object = list2.get(0);
}