


- 1.通配符的使用
通配符: ?
类A是类B的父类,G 和 G 是没有关系的,二者共同的父类是:G<?>
* 
package com.atguigu.java3;import org.junit.Test;import java.util.ArrayList;import java.util.Iterator;import java.util.List;/*** 1.通配符的使用** 通配符: ?** 类A是类B的父类,G<A> 和 G<B> 是没有关系的,二者共同的父类是:G<?>** @author Dxkstart* @create 2021-05-28 11:23*/public class GenericTest2 {@Testpublic void test1() {List<Object> list1 = null;List<String> list2 = null;List<?> list = null;list = list1;list = list2;//正确的// print(list1);// print(list2);//ArrayList<String> list3 = new ArrayList<>();list3.add("AA");list3.add("BB");list3.add("CC");list = list3;//添加(写入):对于List<?> 就不能向其内部添加数据。// list.add("EE");// list.add('?');list.add(null);//可以加null//获取(读):允许读取数据,读取的数据类型为Object。Object o = list.get(0);System.out.println(o);}public void print(List<?> list) {Iterator<?> iterator = list.iterator();while (iterator.hasNext()) {Object obj = iterator.next();System.out.println(obj);}}/*3.有限制条件的通配符的使用? extends A:G<? extends A> 可以作为G<A> 和 G<B>的父类,其中B是A的子类? super A:G<? super <A> 可以作为G<A> 和 G<B>的父类,其中B是A的父类*/@Testpublic void test2(){List<? extends Person> list1 = null;//大于等于PersonList<? super Person> list2 = null;//小于等于PersonList<Student> list3 = new ArrayList<Student>();List<Person> list4 = new ArrayList<Person>();List<Object> list5 = new ArrayList<Object>();list1 = list3;list1 = list4;// list1 = list5;// list2 = list3;list2 = list4;list2 = list5;//读取数据list1 = list4;Person p = list1.get(0);//编译不通过// Student s = list1.get(0);list2 = list4;Object object = list2.get(0);//编译不通过// Person p = list2.get(0);//写入数据//编译不通过// list1.add(new Student());list2.add(new Person());list2.add(new Student());}}
