【Java笔记】泛型通配符<?>的使用
在实例化对象的时候,不确定泛型参数的具体类型时,可以使用通配符进行对象定义
通配符的使用
如果类 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()); } }
下一篇:
PC桌面客户端软件开发工具