泛型的高级使用——容器中使用泛型(泛型的上限与下限)
代码中有对泛型上限与下限的解释
1、先编写一个父类Person
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
2、再写一个子类Student继承父类,需要注意的是 子类重写的toString方法(如下)
public class Student extends Person {
private int num;
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public Student(String name, int age, int num) {
super(name, age);
this.num = num;
}
public Student() {
super();
}
@Override
public String toString() {
return super.toString()+"Student [num=" + num + "]";
}
}
3、编写测试类Test
public class Test {
public static void main(String[] args) {
//创建一个集合对象,用于存储Person类型的对象
ArrayList<Person> alp = new ArrayList<Person>();
Person p1=new Person("张三",18);
Person p2=new Person("李四",20);
alp.add(p1);
alp.add(p2);
//创建一个集合对象,用于存储Student类型的对象
ArrayList<Student> als = new ArrayList<Student>();
Student s1 = new Student("王五",18,201611);
Student s2 = new Student("刘强",20,201711);
als.add(s1);
als.add(s2);
print(als);
System.out.println("-----------------------------");
show(alp);
}
/**
* 泛型的上限(extends)
* <? extends Person> 表示Person类型以及Person类的子类的类型,这里只有一个子类Student
* 这样一来,print()方法就可以被 Person类型 及其 子类的类型 的集合对象调用了。
*/
static void print(ArrayList<? extends Person> al) {
for(Person p:al) {
System.out.println(p);
}
}
/**
* 泛型的下限(super)
* 同上理,show()方法可以被 Student类型 及其 父类的类型 的集合对象(上限到Object类型)调用了
*/
static void show(ArrayList<? super Student> al) {
for(Object obj:al) { //注意这里必须用Object类型
System.out.println(obj);
}
}
}