List<String>与List<Object>,并不具备父子类关系
List<Object>与ArrayList<Object> 存在父子类关系
通配符:
<?>
通配符的读取和写入的要求:
对于list<?> 不能在添加数据: list.add()不行,除了添加Null之外
读取:(只能读取到Object)
有限制条件的通配符的使用:
package TongPeiFu;
import org.junit.Test;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class test {
@Test
public void test(){
List<Object> list1 = null;
List<String> list2 = null;
List<?> list = null;
list = list1;
list = list2;
List<String > list3 = new ArrayList<>();
list3.add("aa");
list3.add("bb");
list3.add("cc");
list = list3;
}
public void show(List<?> list){
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
}
@Test
public void test2(){
List<? extends Person> list1 = null;
List<? super Person> list2 = null;
List<Person> list3 = null;
List<Student> list4 = null;
List<Object> list5 = null;
// ? extends Person 此时?指Person类的子类或Person类本身,不能时Person类的父类(Object)
list1 = list3;
list1 = list4;
// list1 = list5;
// ? super Person同理;
// 接受数据
list3 = new ArrayList<Person>();
list4 = new ArrayList<Student>();
list5 = new ArrayList<Object>();
list1= list4;
// Student st = list1.get(0); list1的泛型是 ?extends Person的,所以最小只能用Person接收
list2 = list3;
// list2 泛型结构为<? super Person>只能用Object的对象接受
Object obj = list2.get(0);
// 写入数据
// 对于list1来讲: 其泛型结构是Person的子类,所以不确定
// list1.add(new Student()); 不可以
// list1.add(new Person()); 不可以
// 对于list2来讲:其泛型结构是Person的父类,所以Person类及其子类都可以写入
list2.add(new Person());
list2.add(new Student());
// list2.add(new Object()); 不可以
}
}
class Person{}
class Student extends Person{}