在java中使用Comparator中的super

时间:2012-12-09 09:37:13

标签: java comparator

我理解

Comparator < ? super T> comp

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

的目的
  

超级T

有人可以解释一下吗?

3 个答案:

答案 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的特定内容即可进行比较。