泛型的高級使用——容器中使用泛型(泛型的上限與下限)
代碼中有對泛型上限與下限的解釋
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);
}
}
}