13

我明白在

Comparator < ? super T> comp

它根据指定比较器定义的顺序返回给定集合的最大元素。但我不明白的目的

超级T

谁能解释一下?

4

3 回答 3

20

该术语的? super T意思是“未知类型,它是 T 的超类,或者是 T 的超类”,在泛型的说法中,它的下限是 T。

使用此签名是因为 T 可以分配给任何类型为 T 或 T 超类的变量并与之进行比较。即,如果 Comparator 可以在其 compare() 方法中接受 T 的超类,则可以传入一个T。

这遵循 PECS 助记符:“Producer Extends,Consumer Super”,这意味着事物的生产者应该使用具有上限的事物(?扩展 T),而消费者(如使用事物的比较器实现)应该使用下限( ?超T)。

于 2012-12-09T09:39:59.630 回答
6

在这里< ? super T>意味着泛型- 不是比较。

这意味着你有Comparator一个泛型类型(扩展? super T的东西是超类型的),如this thread中所述T

comp是变量名(绑定)。

所以基本上这里Comparator < ? super T>是一个类型并且comp是一个标识符(变量名),即类型Comparator <? super T>


更多信息:Java 泛型

于 2012-12-09T09:39:01.617 回答
-1

让我们以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 的细节来进行比较。

于 2020-11-09T13:50:44.227 回答