在PriorityQueue中定义的Java jdk8源代码使用了如下所定义的比较器
/**
* The comparator, or null if priority queue uses elements'
* natural ordering.
*/
private final Comparator<? super E> comparator;源代码这里 (第108行)
为什么需要使用的类型是超级的E而不是简单的E。
换句话说,为什么不像下面这样定义比较器:
private final Comparator<E> comparator;这种额外的抽象背后的动机是什么?
发布于 2022-03-18 22:20:49
因为为什么不。
给出一个可以比较任意2个CharSequence对象的比较器(CharSequence是一个接口;String、StringBuilder和其他一些实现它的东西),那么。当您只需要比较字符串时,这也同样好。所有的字符串也都是CharSequences,所以一个比较器可以告诉你一个“先来”的两个字符序列对象,它可以很好地完成这项工作。
泛型在默认情况下是不变的,所以如果您有一个PriorityQueue<String>,并且它按照您的意愿工作,它看起来就像Comparator<E>,这意味着Comparator<String>,而Comparator<CharSequence>是不兼容的。就像将String传递给需要Integer对象的方法一样,它只是不编译。
因此,<? super E>使您可以传递一个Comparator<CharSequence>。
当然,它并不经常出现,但这样“更正确”。我相信如果你碰巧有一个CharSequences的比较器而不能用它来驱动PriorityQueue<String>,你肯定会感到惊讶的。
https://stackoverflow.com/questions/71533705
复制相似问题