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 {@Testpublic 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);}}@Testpublic 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{}