在Java泛型中,?表示通配符,即未知。
1:?extends T 表示上界类型通配符。
1:?super T 表示下界类型通配符。
< T > 等同于 < T extends Object>
< ? > 等同于 < ? extends Object>
上界类型通配符。
//这种写法是编译不通过的。因为容器之间没有继承关系。 List<Parent> list=new ArrayList<Child>(); //这种写法可以编译通过 List<? extends Parent> list=new ArrayList<Child>(); //但是在添加时编译不通过,因为无法确定加入元素具体是哪个子类,只知道是Parent的派生类。 list.add(new Parent()); //编译正确。因为都是Parent的派生类,小转大不需要强转。 Parent parent= list.get(0);
下界类型通配符。
List<? super Parent> list=new ArrayList<>(); //是合法的,因为自动强转了,小转大,是隐形的 list.add(new Child()); //编译报错,需要强转,因为大转小需要强转 Parent child= list.get(0); Child child= list.get(0); //编译正确 Object pa= list.get(0);
使用场景:
1:上界用于取数据,遍历数组。
2:下界用于存储数据。
3:不能同时生命泛型上下界。