Java 泛型中的 PECS 原则
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); }
上一篇:
IDEA上Java项目控制台中文乱码