我明白在
Comparator < ? super T> comp
它根据指定比较器定义的顺序返回给定集合的最大元素。但我不明白的目的
超级T
谁能解释一下?
该术语的? super T
意思是“未知类型,它是 T 的超类,或者是 T 的超类”,在泛型的说法中,它的下限是 T。
使用此签名是因为 T 可以分配给任何类型为 T 或 T 超类的变量并与之进行比较。即,如果 Comparator 可以在其 compare() 方法中接受 T 的超类,则可以传入一个T。
这遵循 PECS 助记符:“Producer Extends,Consumer Super”,这意味着事物的生产者应该使用具有上限的事物(?扩展 T),而消费者(如使用事物的比较器实现)应该使用下限( ?超T)。
在这里< ? super T>
意味着泛型- 不是比较。
这意味着你有Comparator
一个泛型类型(扩展? super T
的东西是超类型的),如this thread中所述T
comp
是变量名(绑定)。
所以基本上这里Comparator < ? super T>
是一个类型并且comp
是一个标识符(变量名),即类型Comparator <? super T>
更多信息:Java 泛型
让我们以TreeSet 的一个构造函数的类型为例:
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>
部分TreeSet(Comparator<? super String> comparator)
还允许我们为构造函数提供一个比较超类型字符串的比较器。您可能会说这是一个更通用、更不具体的比较器。
例如,CharSequence
是 String 的超类型,这也是它起作用的原因:
Comparator<CharSequence> myCharSeqComparator = new Comparator<>() {
@Override
public int compare(CharSequence o1, CharSequence o2) {
return 0;
}
};
var mySet2 = new TreeSet<String>(myCharSeqComparator);
假设, ifTreeSet
的构造函数是这样定义的:
TreeSet(Comparator<E> comparator)
在我们的示例中专门针对
TreeSet(Comparator<String> comparator)
我们只能提供Comparator<String>
,但不能Comparator<CharSequence>
或Comparator<Object>
。
这将是一个遗憾,因为我们可能想要使用更通用的比较器,这些比较器不需要 String 的细节来进行比较。