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