为什么需要 (泛型通配符?)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的子类(父子类问题) |



