v 一.程序中無形之中用到的泛型
import java.util.*; class Person implements Comparable<Person>{String name;int age;Person(){name = "";age = 0;}Person(String name, int age){this.name = name;this.age = age;}public String toString(){return name + "...." + age;}public int compareTo(Person o){if(name.compareTo(o.name)==0)return o.age - age;return o.name.compareTo(name);} }class Student extends Person{int score;public Student(){super();}public Student(String name, int age, int score){super(name, age);this.score = score;}public String toString(){return name + "...." + age + "...." + "score: " + score;} }class Worker extends Person{int salary;public Worker(){super();}public Worker(String name, int age, int salary){super(name, age);this.salary = salary;}public String toString(){return name + "...." + age + "...." + "salary: " + salary;} }class ComparatorPerson implements Comparator<Person>{public int compare(Person o1, Person o2){if(o1.name.compareTo(o2.name)==0)return o1.age - o2.age;return o1.name.compareTo(o2.name);} }public class Test{public static void main(String[] args){ArrayList<Person> arr = new ArrayList<Person>();arr.add(new Person("hujunzheng", 22));arr.add(new Person("caihaibin", 21));arr.add(new Person("huangweidong", 22));ArrayList<Student> arr1 = new ArrayList<Student>();arr1.add(new Student("hujunzheng", 22, 500));arr1.add(new Student("caihaibin", 21, 444));arr1.add(new Student("huangweidong", 22, 777));ArrayList<Worker> arr2 = new ArrayList<Worker>();arr2.add(new Worker("789", 22, 500));arr2.add(new Worker("465", 21, 444));arr2.add(new Worker("798", 22, 777));//public boolean addAll(Collection<? extends E> c)// 泛型的上限:用于存儲的數據// 如果不是<? extends E> 而只是<E> 那么E的子類型就不能加載進來!因為Collection<Person> 和 ArrayList<Student>泛型管理的不是同一數據類型// 而 <? extends E> 要求傳進來的對象實例管理的泛型只要是 E 或者是 E的子類都行! arr.addAll(arr1);arr.addAll(arr2);Object[] oo = null;Arrays.sort(oo=arr.toArray());for(Object o : oo)System.out.println(o);//public TreeSet(Comparator<? super E> c); 傳遞的是比較泛型為 E 或者是 E的父類的比較器//在進行 E類型兩個數據比較的時候, 用 E類 或者 E類型的父類型進行接收,并使用 ?類型的定義的比較方式! System.out.println("泛型上限,下限...................................................");TreeSet<Worker> tw = new TreeSet<Worker>(new ComparatorPerson());// E 是 Worker, 傳遞的是其父類Person的比較器 tw.addAll(arr2);for(Iterator it = tw.iterator(); it.hasNext(); )System.out.println(it.next());TreeSet<Student> ts= new TreeSet<Student>(new ComparatorPerson());// E 是 Student, 傳遞的是其父類Person的比較器 ts.addAll(arr1);for(Object o : ts.toArray())System.out.println(o);//上述的Worker 和 Student在TreeSet中排序時使用的比較器都是Person類實現的比較器 } }
v 二.簡單的理解
?
ArrayList<Person> alist = new ArrayList<Person>(); ArrayList<? extends Person> list = new ArrayList<Student>(); alist.addAll(list);
Person p = new Person();
Student s = new Student();
//compile error
list.add(p);或者 list.add(s);
一般來講,定義成<? extends T>的參數通常只能用來從里面取數據,而不能用add方法添加數據。
ArrayList<? super Person> list = new ArrayList<Person>(); Student s = new Student(); list.add(s); s = (Student) list.get(0);
而定義成<? super T>的參數是可以用add方法來進行數據的添加的。它接受的 T類型或者T的父類,為什么Student是Person的子類但是仍能接受呢?因為在加入的時候講Sutdent進行了向上轉型為Object,這就是為什么在取出元素的時候是Object類型了!