为什么需要 (泛型通配符?)Java泛型中关于?, ?extents A ,? super A 三个的联系与区别。
Java中可以自动向下转型,比如B extends A。(A是B的父类)
Listlist1 = null; List
小结:
- B是 A的子类。但G与G没有关系,不能相互赋值。(重要)
- B是A的子类。B
是A 的子类
为了统一处理泛型参数的父子类问题。引入公共父类List>.可以接收任意的泛型对象
//可以接收所有类型的实例 public void iterate(List> list) { Iterator> iterator = list.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); } } @Test void test2() { iterate(list1); iterate(list2); }get与set
@Test void test3(){ list=list1; //可以get Object o = list.get(0); // list.add(null); //?为不确定类型,运行时通过传入参数确定,编译期还不确定,所以不能添加除了null的任何值 //list.add("AAA"); }带参数限制的?
@Test void test4() { List
总结:
通配符类型 | 参数列表可接收的范围 | get类型 | set类型 | 常用地方 |
---|---|---|---|---|
? | (-∞,+∞) | Object | 除null,不可set | 参数列表中需要处理任何泛型类型时 |
?super Person | [Person,?) | Object | 可以setPerson及其子类 | 参数列表中只能添加Person的子类。并且方便get(操作问题),此时违反正常逻辑中的父类参数能接受子类对象的约定。 |
?extends Person | (-∞,?] | Person | 除null,不可set | 返回值中需要限定类型,只能返回Person的子类(父子类问题) |