我理解
Comparator < ? super T> comp
根据指定比较器引发的顺序返回给定集合的最大元素。但我不明白
的目的超级T
有人可以解释一下吗?
答案 0 :(得分:11)
术语? super T
的意思是“未知的类型,或者是T的超类”,在泛型用语中意味着它的下限是T.
使用此签名是因为T可以被分配给任何类型为或者是超类T的变量,并与之比较。即如果比较器可以在其compare()方法中接受超类T ,你可以通过T。
这遵循PECS助记符:“Producer Extends,Consumer Super”,这意味着事物的生产者应该使用 upper 绑定(?extends T)和消费者(比较器实现)的东西使用事物)应该与 lower 界限(?super T)一起使用。
答案 1 :(得分:3)
此处< ? super T>
表示泛型 - 不进行比较。
这意味着您的Comparator
的泛型类型为? super T
(扩展超级T
类型的内容),如{{3}中所述}}
comp
是变量名称(绑定)。
所以基本上在这里Comparator < ? super T>
是类型而comp
是标识符(变量名),类型为{{1} }}
了解更多信息:this thread
答案 2 :(得分:0)
让我们以TreeSet's constructors之一的类型为例:
TreeSet(Comparator<? super E> comparator)
想象一下E
是一个字符串,因此我们在精神上专门研究了构造函数:
TreeSet(Comparator<? super String> comparator)
我可以像这样实例化TreeSet
:
var mySet = new TreeSet<String>(myStringComparator);
在这里,myStringComparator
可能看起来像这样。
Comparator<String> myStringComparator = new Comparator<>() {
@Override
public int compare(String o1, String o2) {
return 0;
}
};
<? super String>
的{{1}}部分允许我们还为构造函数提供一个比较器,该比较器比较字符串的 super 类型。您可能会说这是更一般,更具体的比较器。
例如,CharSequence
是String的超级类型,这也是为什么它也起作用的原因:
TreeSet(Comparator<? super String> comparator)
假设,Comparator<CharSequence> myCharSeqComparator = new Comparator<>() {
@Override
public int compare(CharSequence o1, CharSequence o2) {
return 0;
}
};
var mySet2 = new TreeSet<String>(myCharSeqComparator);
的构造函数是这样定义的:
TreeSet
在我们的示例中专门针对
TreeSet(Comparator<E> comparator)
我们只能 提供TreeSet(Comparator<String> comparator)
,但不能提供Comparator<String>
或Comparator<CharSequence>
。
这很遗憾,因为我们可能想使用更通用的比较器,这些比较器不需要String的特定内容即可进行比较。