在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义
目录
通配符的使用
如果类 A 是类 B 的父类,G <A> 和 G <B> 是没有关系的,二者共同的父类是:G <?>
import org.junit.Test;
import java.util.Iterator;
import java.util.List;
public class TongPeiFuTest {
@Test
public void test(){
List<Object> list1 = null;
List<String> list2 = null;
List<?> list = null;
list = list1;
list = list2;
}
public void print(List<?> list){
Iterator<?> iterator = list.iterator();
while (iterator.hasNext()){
Object obj = iterator.next();
System.out.println(obj);
}
}
}
使用通配符后数据的读取和写入
添加或写入:对于 List <?> 就不能再向其内部添加数据,除了添加 null 之外
获取或读取:允许读取数据,读取的数据类型是 Object
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
public class TongPeiFuTest {
@Test
public void test(){
List<String> list = new ArrayList<>();
list.add("AA");
list.add("BB");
list.add("CC");
List<?> list1 = new ArrayList<>();
list1 = list;
//写入
list1.add(null);
//读取
Object o = list.get(0);
System.out.println(o);
}
}
>>> AA
有限制条件的通配符的使用
? extends A :
G<? extends A> 可以作为 G <A> 和 G <B> 的父类,其中 B 是 A 的子类
? super A :
G<? super A> 可以作为 G <A> 和 G <B> 的父类,其中 B 是 A 的父类
//假设我们定义了 Person 类,Student 类继承 Person 类,以下注释的情况编译不通过
import org.junit.Test;
import java.util.List;
public class TongPeiFuTest {
@Test
public void test() {
List<? extends Person> list1 = null;
List<? super Person> list2 = null;
List<Student> list3 = null;
List<Person> list4 = null;
List<Object> list5 = null;
list1 = list3;
list1 = list4;
// list1 = list5;
// list2 = list3;
list2 = list4;
list2 = list5;
list1 = list3;
Person p = list1.get(0);
// Student s = list1.get(0);
list2 = list4;
Object obj = list2.get(0);
list2.add(new Person());
list2.add(new Student());
}
}