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的限定:

猜你喜欢

转载自blog.csdn.net/u013251413/article/details/80713597