通配符?,?表示占位,表明将来使用的时候在指明类型
- <?>无限定的通配符, 是让泛型能够接受未知类型的数据
- <? extends E> 有上限通配符,能够接受指定类及其子类类型的数据,E就是该泛型的上边界
-
- 注意:这里不仅继承了父类E的子类,也可以代指显现了接口E的类
-
- <? super E>:有下限的通配符。能够指定其父类类型的数据,E就是该泛型类型的下边界。
- 注意:你可以为一个泛型指定上边界或者下边界,但是不能同时指定上下边界
与<T>类型比较
- 比起<T>类型,<?>通配符不需要定义类型,传入的默认为Object,所以在方法返回值使用<?>需要将Object向下转型为需要的类型
- 可以直接在类中定义静态方法,因为其<?>的类型默认为Object,是确定的类型,不需要像<T>要在方法返回值之前进行定义
-
public static void main(String[] args) { List<Person1> personList = new ArrayList<>(); personList.add(new Person1("11", "11")); personList.add(new Person1("22", "22")); personList.add(new Person1("33", "33")); print(personList); System.out.println("======================"); List<Man> manList = new ArrayList<>(); manList.add(new Man("11", "11")); manList.add(new Man("22", "22")); manList.add(new Man("33", "33")); print(manList); } /** * List<? extends Person1> :有上限的通配符,表示传入的对象只能是Person1 或其的子类, <E>元素类型代表这个泛型通配符的上限 * @param list */ static void print(List<? extends Person1> list) { for (Object o : list) { System.out.println(o); } }
<? Super E>有上限通配符
- 只能传递有E 及其父类到上限通配符中