黑马程序员技术交流社区
标题:
关于泛型问题
[打印本页]
作者:
胡卿
时间:
2012-6-18 12:03
标题:
关于泛型问题
本帖最后由 胡卿 于 2012-6-18 12:33 编辑
。
import java.util.*;
class GenericDemo8
{
public static void main(String[] args)
{
//TreeSet(Comparator<? super E> comparator)
TreeSet<Student> ts = new TreeSet<Student>(new CompareByName());
ts.add(new Student("s1"));
ts.add(new Student("s3"));
ts.add(new Student("s2"));
ts.add(new Student("s0"));
System.out.println(ts);
TreeSet<Worker> ts1 = new TreeSet<Worker>(new CompareByName());
ts1.add(new Worker("w1"));
ts1.add(new Worker("w3"));
ts1.add(new Worker("w2"));
ts1.add(new Worker("w0"));
System.out.println(ts1);
}
}
class CompareByName implements Comparator<Person>//? super E//只要能接收集合中的元素对象即可所以Student可以 Person也可以
{
public int compare(Person s1,Person s2)
{
return s1.getName().compareTo(s2.getName());
}
复制代码
为什么<Person>可以呢,<? super E>不是接收E或者E的父类型么,那么Student,和Worker明明是Person的子类啊,为什么可以这样写,
还是说这E指的不是Person?
作者:
龙秋地
时间:
2012-6-18 12:10
楼主,如果有机会可以查一下JDK API
java.util 包中
接口 Comparator<T>,他中的泛型只能一个确切的对象,而不是可以继承父类的子类.
public interface Comparator<T>比较函数强行对某些对象 collection 进行整体排序。
可以将 Comparator 传递给 sort 方法(如 Collections.sort),从而允许在排序顺序上实现精确控制。
还可以使用 Comparator 来控制某些数据结构(如 TreeSet 或 TreeMap)的顺序。
至于楼主的意思可能把他误以为是方法了.
这是我查找API官方的方法:
Comparator<? super K> comparator()
返回用于对此映射进行排序的比较器,如果此映射使用它的键的自然顺序,则返回 null。
Comparator<? super E> comparator()
返回用于确定已排序 set 顺序的比较器,或者,如果此树 set 使用其元素的自然顺序,则返回 null。
这个方法还有几个类中有,是java.util.concurrent.PriorityBlockingQueue.comparator()
java.util.PriorityQueue.comparator()
java.util.SortedMap.comparator()
java.util.SortedSet.comparator()
java.util.TreeMap.comparator()
java.util.TreeSet.comparator() .
这些方法都可以像楼主使用的那样泛型中使用继承父类的子类或者是父类本身.
作者:
赵玮_Tom
时间:
2012-6-18 15:58
很简单的问题,为啥给搞复杂了尼?
比较器在使用泛型时一般都涉及到了泛型的下限(用?super E 表示)。其实这里完全没有必要在子类类型、父类类型、比较器使用的泛型之间绕来绕去。
一句话:
比较器使用啥泛型,就能对相应类型及其子类集合进行排序
。比如上例,比较器的泛型是Person,那么这个比较器就可以对装有Person和Person子类的集合进行排序,当然也能对Student和Worker类型的集合进行排序喽。
如果还不懂,在用一个形象的比喻:你说一个可以对动物进行排序的比较器,能对猫或者狗进行排序吗?
结果当然是肯定的了。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2