错误代码分析:
package en.iteast.generic.demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.TreeSet;
import en.iteast.generic.domain.Person;
import en.iteast.generic.domain.Student;
import en.iteast.generic.domain.Worker;
public class GenericDemo11 {
public static void main(String[] args) {
/*
* 1.
* 演示泛型限定在API中的体现。
* TreeSet的构造函数。
* TreeSet(Comparator<? super E> comparator)
* 什么时候会用到下限呢?
*
*/
//创建一个匿名内部类,实现Comparator接口,生成一个比较器
Comparator<Student> comp = new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int temp = o1.getAge() - o2.getAge();
return temp == 0 ? o1.getName().compareTo(o2.getName()) : temp;
}
};
TreeSet<Student> treeSet = new TreeSet<Student>(comp);
treeSet.add(new Student(21,"zhang3"));
treeSet.add(new Student(19,"lki4"));
treeSet.add(new Student(24,"LiXinTing"));
treeSet.add(new Student(23,"LiXinTing"));
treeSet.add(new Student(29,"LiXinTing"));
TreeSet<Worker> treeSet1 = new TreeSet<Worker>(comp);
/**
*2.
* The constructor TreeSet<Worker>(Comparator<Student>) is undefined
* 报错原因:
* 比较器中只能接受Student类型
*解决:
*利用泛型的下限,使比较器既能接受Student类型,也能接受Person类型
*/
treeSe1t.add(new Worker(21,"zhang3"));
treeSet1.add(new Worker(19,"lki4"));
treeSet1.add(new Worker(24,"LiXinTing"));
treeSet1.add(new Worker(23,"LiXinTing"));
treeSet1.add(new Worker(29,"LiXinTing"));
}
}
利用泛型下限解决后的代码:
package en.iteast.generic.demo;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Comparator;
import java.util.TreeSet;
import en.iteast.generic.domain.Person;
import en.iteast.generic.domain.Student;
import en.iteast.generic.domain.Worker;
public class GenericDemo11 {
public static void main(String[] args) {
/*
* 1.
* 演示泛型限定在API中的体现。
* TreeSet的构造函数。
* TreeSet(Comparator<? super E> comparator)
* 什么时候会用到下限呢?
* 当从容器中取出元素操作时,可以用E类型接收,也可以用E的父类型接收。
*/
*/
//创建一个匿名内部类,实现Comparator接口,生成一个比较器
Comparator<Person> comp = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {//对象会调用该方法进行比较
int temp = o1.getAge() - o2.getAge();
return temp == 0 ? o1.getName().compareTo(o2.getName()) : temp;
}
};
TreeSet<Student> treeSet = new TreeSet<Student>(comp);//Person类型能接受Student类型
treeSet.add(new Student(21,"zhang3"));
treeSet.add(new Student(19,"lki4"));
treeSet.add(new Student(24,"LiXinTing"));
treeSet.add(new Student(23,"LiXinTing"));
treeSet.add(new Student(29,"LiXinTing"));
TreeSet<Worker> treeSet1 = new TreeSet<Worker>(comp);//Person类型能接受Worker类型
treeSet1.add(new Worker(21,"zhang3"));
treeSet1.add(new Worker(19,"lki4"));
treeSet1.add(new Worker(24,"LiXinTing"));
treeSet1.add(new Worker(23,"LiXinTing"));
treeSet1.add(new Worker(29,"LiXinTing"));
}
}
//下限类的设计:
class YourTreeSet<E>{
public YourTreeSet(Collection<? super E> collection){
}
}