我正在阅读java源代码,我发现如下:http:
//www.java2s.com/Code/JavaAPI/java.util/newTreeSetEComparatorsuperEc.htm
我不明白为什么这个构造函数的参数是<? super E>.
正如我的理解,应该是<? extend E>代替<? super E>,因为如果E是可比的,E的儿童必须在可比,而E的父母可能不.
Joe*_*e C 14
让我们考虑三类:Drink,Juice extends Drink,和OrangeJuice extends Juice.
如果我想要一个TreeSet<Juice>,我需要一个比较任何两个果汁的比较器.当然Comparator<Juice>会做到这一点.
A Comparator<Drink>也会这样做,因为它可以比较任何两种饮料,因此可以比较任何两种果汁.
A Comparator<OrangeJuice>不会这样做.如果我想添加一AppleJuice组果汁,那就与这个比较器不兼容,因为它只能比较橙汁.
你创建一组排序的香蕉.要做到这一点,你需要能够比较香蕉.因此,您可以使用香蕉比较器来做到这一点.但如果你有一个可以对任何种类的水果(包括香蕉)进行分类的比较物,那么它也会起作用.所以你也可以用a Comparator<Fruit>或甚Comparator<Food>至a 来分类你的香蕉.
这Comparator<? super E>就是使用a的原因.
如果是的话Comparator<? extends E>,你就可以制作一套带香蕉的香蕉Comparator<DriedBanana>.但这不起作用:干香蕉的比较只能比较干香蕉.不是所有种类的香蕉.
有关更多信息,请阅读什么是PECS(生产者扩展消费者超级)?
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |