泛型限定中的上限和下限两个不同的概念,用法完全不同。
上限
package com.heihei.test8;
import java.util.*;
public class GenericTest {
public static void main(String[] args) {
ArrayList list1 = new ArrayList<>();
list1.add(new Student("12"));
list1.add(new Student("02"));
list1.add(new Student("e12"));
list1.add(new Student("g12"));
printList(list1);
ArrayList list2 = new ArrayList<>();
list2.add(new Worker("2"));
list2.add(new Worker("d"));
list2.add(new Worker("e12"));
list2.add(new Worker("g12"));
printList(list2);
}
/*
*
* 上限,用在声明一个集合,类似父类引用指向子类对象
* */
public static void printList(ArrayList extends Persion> list) {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
class Persion {
private String name;
public Persion(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student extends Persion {
public Student(String name) {
super(name);
}
}
class Worker extends Persion {
public Worker(String name) {
super(name);
}
}
上限
package com.heihei.test7;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
public class GenericTest {
public static void main(String[] args) {
/*
* Comp1标识出Persion是Student的父类, super E>
*
* */
TreeSet ts1 = new TreeSet<>(new Comp1());
ts1.add(new Student("12"));
ts1.add(new Student("02"));
ts1.add(new Student("e12"));
ts1.add(new Student("g12"));
Iterator i1 = ts1.iterator();
while (i1.hasNext()) {
System.out.println(i1.next());
}
/*
* Comp1标识出Persion是Worker的父类, super E>
*
* */
TreeSet ts2 = new TreeSet<>(new Comp1());
ts2.add(new Worker("2"));
ts2.add(new Worker("d"));
ts2.add(new Worker("e12"));
ts2.add(new Worker("g12"));
Iterator i2 = ts2.iterator();
while (i2.hasNext()) {
System.out.println(i2.next());
}
}
}
/**
* 向上限定,标识出一个父类
*
* TreeSet(Comparator super E> comparator)
*
*/
class Comp1 implements Comparator {
@Override
public int compare(Persion p1, Persion p2) {
return p1.getName().compareTo(p2.getName());
}
}
class Persion {
private String name;
public Persion(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
class Student extends Persion {
public Student(String name) {
super(name);
}
}
class Worker extends Persion {
public Worker(String name) {
super(name);
}
}
从上面的代码可以看出,上限中
TreeSet(Comparator super E> comparator)
TreeSet的构造方法需要 声明元素 父类 的比较器即可