<?>
允许所有泛型的引用调用
通配符指定上限
上限 extends: 使用时指定的类型必须是继承某个类,或者实现某个接口,即<=
通配符指定下限
下限 super: 使用时指定的类型不能小于操作的类,即 >=
Person.java
package com.klvchen.java2; public class Person { }
Student.java
package com.klvchen.java2; public class Student extends Person{ }
GenericTest.java
package com.klvchen.java2; import org.junit.Test; import java.util.AbstractList; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class GenericTest { /* 1. 泛型在继承方面的体现 类A是类B的父类,G<A>和G<B>二者不具备子父类关系,二者是并列关系。 */ @Test public void test1(){ Object obj = null; String str = null; obj = str; Object[] arr1 = null; String[] arr2 = null; arr1 = arr2; List<Object> list1 = null; List<String> list2 = null; // 此时的 list1 和 list2 的类型不具有子父类关系 // 编译不通过 //list1 = list2; show(list1); show1((list2)); } public void show1(List<String> list) { } public void show(List<Object> list) { } @Test public void test2(){ AbstractList<String> list1 = null; List<String> list2 = null; ArrayList<String> list3 = null; list1 = list3; list2 = list3; List<String> list4 = new ArrayList<>(); } /* 2. 通配符的使用 通配符: ? 类A是类B的父类,G<A>和G<B>是没有关系的,二者共同的父类是:G<?> */ @Test public void test3(){ List<Object> list1 = null; List<String> list2 = null; List<?> list = null; list = list1; list = list2; //print(list1); //print(list2); List<String> list3 = new ArrayList<>(); list3.add("AA"); list3.add("BB"); list3.add("CC"); list = list3; //添加(写入): 对于list<?>就不能向其内部添加数据 //除了添加 null 以外, //list.add("DD"); list.add(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<? extends A> 可以作为G<A>和G<B>的父类的,其中B是A的父类 */ @Test public void test4(){ List<? extends Person> list1 = null; List<? super Person> list2 = null; List<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 = list3; Person p = list1.get(0); //编译不通过 //Student s = list1.get(0); list2 = list4; Object obj = list2.get(0); //编译不通过 //Person obj = list2.get(0); //写入数据: // 编译不通过 //list1.add(new Student()); //编译不通过 list2.add(new Person()); list2.add(new Student()); } }