- 可以對類型進行限定 上限 --> ? extends E: 接收 E 類型或者 E 類型的子類對象 下限 --> ? super E: 接收 E 類型或者 E 的父類型
- 一般在存儲元素的時候都是用上限,因為這樣取出都是按照上限類型來運算的,不會出現類型安全隱患。
public class GenericStudent extends GenericPerson {
public GenericStudent() {
super();
// TODO Auto-generated constructor stub
}
public GenericStudent(String name, int age) {
super(name, age);
}
public String toString() {
return "Student: " + getName() + " @ " + getAge();
}
}
public class GenericWorker extends GenericPerson {
public GenericWorker() {
super();
// TODO Auto-generated constructor stub
}
public GenericWorker(String name, int age) {
super(name, age);
}
public String toString() {
return "Worker: " + getName() + " @ " + getAge();
}
}
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class GenericAdvanceDemo {
public static void main(String[] args) {
ArrayList<GenericStudent> al = new ArrayList<>();
al.add(new GenericStudent("Jack", 20));
al.add(new GenericStudent("Vivian", 30));
al.add(new GenericStudent("Mike", 40));
ArrayList<GenericWorker> al2 = new ArrayList<>();
al2.add(new GenericWorker("Jervis", 10));
al2.add(new GenericWorker("Jacky", 20));
al2.add(new GenericWorker("Eric", 30));
/*
ArrayList<String> al3 = new ArrayList<>();
al3.add("abc1");
al3.add("abc2");
al3.add("abc3");
*/
printCollection(al);
printCollection(al2);
// printCollection(al3);//編譯失敗
}
//迭代並打印集合中的元素
public static void printCollection(Collection<? extends GenericPerson> al) {//泛型的限定
Iterator<? extends GenericPerson> it = al.iterator();
while(it.hasNext()) {
GenericPerson p = it.next();//已限定泛型
System.out.println(p.getName() + " @ " + p.getAge());
}
}
}
打印結果
Jack @ 20
Vivian @ 30
Mike @ 40
Jervis @ 10
Jacky @ 20
Eric @ 30
public static void printCollection2(Collection<? super GenericStudent> al) {//泛型的下限
Iterator<? super GenericStudent> it = al.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}