/**
* 泛型通配符<?>的使用
* ? extends E:接收E類型對象,包括E類型的子類型-->泛型上限
* ? super E:接收E類型對象,包括E類型父類型-->泛型下限
*/
//創建動物類
class Animal{
Animal(String name,int age){
this.name = name;
this.age = age;
}
private String name;
private int age;
public String getName() {
return name;
}
public int getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String toString() {
return "[name=" + name + ", age=" + age + "]";
}
}
//創建貓類
class Cat extends Animal{
Cat(String name, int age) {
super(name, age);
}
}
//創建狗類
class Dog extends Animal{
Dog(String name, int age) {
super(name, age);
}
}
public class GenericObjectDemo {
public static void main(String[] args) {
ArrayList<Dog> ag = new ArrayList<Dog>();
ArrayList<Cat> ac = new ArrayList<Cat>();
fonctionD(ag);
fonctionC(ac);
}
private static void fonctionD(ArrayList<Dog> ag) {
ag.add(new Dog("旺財", 18));
ag.add(new Dog("哈士奇", 10));
ag.add(new Dog("哈奇", 5));
iterators1(ag);
iterators3(ag);
//此時編譯錯誤,限定了Cat對象
//iterators2(ag);
}
private static void fonctionC(ArrayList<Cat> ac) {
ac.add(new Cat("湯姆",12));
ac.add(new Cat("珀斯",30));
ac.add(new Cat("米奇",8));
iterators2(ac);
//編譯錯誤,此時限定了Dog對象
//iterators3(ac);
iterators2(new ArrayList<Animal> ());
//父類編譯通過
iterators3(new ArrayList<Animal> ());
}
//泛型通配符的使用
private static void iterators1(Collection<?> c) {
System.out.println("泛型通配符:");
Iterator<?> it = c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
//泛型? extends的限定-->限定了此時Cat對象
private static void iterators2(Collection<? extends Animal> a) {
System.out.println("泛型? extends的限定:");
Iterator<? extends Animal> it = a.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
//泛型? super的限定-->限定了此時Cat對象
private static void iterators3(Collection<? super Dog> c) {
System.out.println("泛型? super的限定:");
Iterator<? super Dog> it = c.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
運行結果:
泛型通配符:
[name=旺財, age=18]
[name=哈士奇, age=10]
[name=哈奇, age=5]
泛型? super的限定:
[name=旺財, age=18]
[name=哈士奇, age=10]
[name=哈奇, age=5]
泛型? extends的限定:
[name=湯姆, age=12]
[name=珀斯, age=30]
[name=米奇, age=8]
泛型? extends的限定:
泛型? super的限定: