Java工具類--泛型(二)

/**
 * 泛型通配符<?>的使用
 * ? 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的限定:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章