【发布时间】:2012-12-09 09:37:12
【问题描述】:
我明白了
Comparator < ? super T> comp
它根据指定比较器定义的顺序返回给定集合的最大元素。但我不明白这个的目的
超级T
谁能解释一下?
【问题讨论】:
标签: java comparator
我明白了
Comparator < ? super T> comp
它根据指定比较器定义的顺序返回给定集合的最大元素。但我不明白这个的目的
超级T
谁能解释一下?
【问题讨论】:
标签: java comparator
? super T 一词的意思是“未知类型,它是 T 的超类,或者是 T 的超类”,在泛型的说法中,它的下限是 T。
使用此签名是因为 T 可以分配给类型为 T 或其超类的任何变量并与之进行比较。即,如果 Comparator 可以在其 compare() 方法中接受 T 的超类,你可以传入一个T。
这遵循 PECS 助记符:“Producer Extends,Consumer Super”,这意味着事物的生产者应该使用具有 上限 边界 (? extends T) 和消费者(如比较器实现)的事物use 东西)应该使用 lower 边界(? super T)。
【讨论】:
这里< ? super T> 表示泛型 - 不是比较。
这意味着您有一个Comparator,其泛型类型为? super T(extends 是T 的超级类型),如this thread 中所述
comp 是变量名(绑定)。
所以基本上这里Comparator < ? super T>是一个类型,comp是一个标识符(变量名),即Comparator <? super T>类型
欲了解更多信息:Java Generics
【讨论】:
我们以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;
}
};
TreeSet(Comparator<? super String> comparator) 的 <? super String> 部分允许我们还为构造函数提供一个比较器,用于比较 super 类型的字符串。您可能会说这是一个更通用、更不具体的比较器。
例如,CharSequence 是 String 的超类型,这也是它起作用的原因:
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> 或Comparator<Object>。
这将是一个遗憾,因为我们可能希望使用更通用的比较器,这些比较器不需要 String 的细节来进行比较。
【讨论】: