java - 为什么 TreeSet<E> 的构造函数接受 E 的参数 super 而不是 E 的 extend

标签 java comparator

我正在阅读 java 源代码,发现如下内容:
http://www.java2s.com/Code/JavaAPI/java.util/newTreeSetEComparatorsuperEc.htm

不明白为什么这个构造函数的参数是<? super E> .

我的理解应该是<? extend E>而不是 <? super E>因为如果 E 是可比较的,则 E 的 child 必须是可比较的,而 E 的 parent 可能不是。

最佳答案

让我们考虑三个类:Drink , Juice extends Drink , 和 OrangeJuice extends Juice .

如果我想要一个 TreeSet<Juice> ,我需要一个比较器来比较任何两种果汁。当然是Comparator<Juice>会这样做。

A Comparator<Drink>也会这样做,因为它能够比较任何两种饮料,从而比较任何两种果汁。

A Comparator<OrangeJuice>不会这样做。如果我想添加 AppleJuice对于我的果汁系列,它与此比较器不兼容,因为它只能比较橙汁。

关于java - 为什么 TreeSet<E> 的构造函数接受 E 的参数 super 而不是 E 的 extend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46875376/

相关文章:

java - 有没有一种通过枚举实现多个比较器的好方法?

Java:实现可比较但条件 if 太多。我怎样才能避免它们?

java - 在finally block 中断zip中的ByteStream复制后关闭GZIPOutputStream

java - Spring 多部分文件最大大小

java - Android - 创建后台服务以接收 PubNub 消息

java - 比较两个或多个 JTables 和 'Highlight' 差异

java - 如何编写 MySql 选择查询,其中 id 不在列表中,可以为空

java - 如何执行 GUI Java 应用程序?

java - Collections.sort() 有效,但 Collections.reverseOrder() 中断

java - 比较器不适用于二叉树