通配符即? ,作为集合类的元素可以匹配任何引用类型 作用,可以使代码更简洁
通配符的使用
List<?> Map<?,?>
List<?>是List、List等各种泛型List的父类 读取 元素为通配符类型的集合,允许读取 写入 元素为通配符类型的集合,不允许写入 实践 package com.atguigu.generic; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Test; /** * 功能描述 * * @since 2022-05-26 */ public class GenericInheriteTest { /** * 泛型的继承关系研究 */ @Test public void test1() { Object n1 = null; String n2 = null; // 子类可以直接赋值给父类 n1 = n2; List<Object> n3 = null; List<String> n4 = null; // 编译报错 A继承于B G<A> 和G<B>没有继承关系 // n3 = n4; ArrayList<Object> n5 = null; // A继承于B A<G> 继承于B<G> n3 = n5; } /** * 通配符的使用 A继承于B G<A> 和G<B>没有继承关系,但两者都继承于G<?> */ @Test public void test2() { List<Object> n1 = null; List<String> n2 = null; List<?> n = null; n = n1; n = n2; // print(n1); // print(n2); List<String> list3 = new ArrayList<>(); list3.add("AA"); list3.add("BB"); list3.add("CC"); n = list3; // 对于List<?> 就不能向其内部添加数据,除了添加null,相当于不能添加,没事不会往里面加null n.add(null); // 获取(读取) ,对于List<?>,允许读取数据,读取的数据类型为Object Object o = n.get(0); System.out.println(o); } public void print(List<?> list) { Iterator<?> iterator = list.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); System.out.println(next); } } }
读取 元素为通配符类型的集合,允许读取
写入 元素为通配符类型的集合,不允许写入
package com.atguigu.generic; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.junit.Test; /** * 功能描述 * * @since 2022-05-26 */ public class GenericInheriteTest { /** * 泛型的继承关系研究 */ @Test public void test1() { Object n1 = null; String n2 = null; // 子类可以直接赋值给父类 n1 = n2; List<Object> n3 = null; List<String> n4 = null; // 编译报错 A继承于B G<A> 和G<B>没有继承关系 // n3 = n4; ArrayList<Object> n5 = null; // A继承于B A<G> 继承于B<G> n3 = n5; } /** * 通配符的使用 A继承于B G<A> 和G<B>没有继承关系,但两者都继承于G<?> */ @Test public void test2() { List<Object> n1 = null; List<String> n2 = null; List<?> n = null; n = n1; n = n2; // print(n1); // print(n2); List<String> list3 = new ArrayList<>(); list3.add("AA"); list3.add("BB"); list3.add("CC"); n = list3; // 对于List<?> 就不能向其内部添加数据,除了添加null,相当于不能添加,没事不会往里面加null n.add(null); // 获取(读取) ,对于List<?>,允许读取数据,读取的数据类型为Object Object o = n.get(0); System.out.println(o); } public void print(List<?> list) { Iterator<?> iterator = list.iterator(); while (iterator.hasNext()) { Object next = iterator.next(); System.out.println(next); } } }