为什么TreeSet <E>的构造函数接受E的参数super而不是E的扩展

Yve*_*ves 9 java comparator

我正在阅读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组果汁,那就与这个比较器不兼容,因为它只能比较橙汁.


JB *_*zet 7

你创建一组排序的香蕉.要做到这一点,你需要能够比较香蕉.因此,您可以使用香蕉比较器来做到这一点.但如果你有一个可以对任何种类的水果(包括香蕉)进行分类的比较物,那么它也会起作用.所以你也可以用a Comparator<Fruit>或甚Comparator<Food>至a 来分类你的香蕉.

这Comparator<? super E>就是使用a的原因.

如果是的话Comparator<? extends E>,你就可以制作一套带香蕉的香蕉Comparator<DriedBanana>.但这不起作用:干香蕉的比较只能比较干香蕉.不是所有种类的香蕉.

有关更多信息,请阅读什么是PECS(生产者扩展消费者超级)?