它应该是而不是因为如果 E 是
可比的,E 的孩子必须是可比的,而父母
E 可能不是。
Comparator 不依赖于 Comparable 对象。
它甚至经常被用作替代品或补充品。
其实这个构造函数
public TreeSet(Comparator<? super E> comparator) {...}
本来可以:
public TreeSet(Comparator<E> comparator) {... }
但是通过指定下界通配符,JDK 开发人员通过允许Comparator 与当前类实例和父类实例互操作,为客户端类提供了更大的灵活性。在某些情况下,这可能是有道理的。
现在这个:
public TreeSet(Comparator<? extend E> comparator) {
无效,因为这意味着您可以使用将子类类型指定为参数的compare() 方法结束。
但是Set 的元素可能包含特定子类的实例,但不仅如此。
想象一下这段代码:
TreeSet<CharSequence> set = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
...
}
});
set.add("string");
set.add(new StringBuilder());
...
我想比较Strings,但Set 可以包含String 实例,也可以包含CharSequence 的任何子类,例如StringBuilder、CharBuffer 等...
如果CharSequence 不是abstract,它也可能包含它们的实例。
通过这个例子,我们明白Comparator<? extend E> 在概念上是错误的。