2

我对这种语法感到困惑,因为起初它看起来好像函数应该返回<E>,但后来我看到void. <E>之前的目的是void什么?

此外,我熟悉边界和泛型,但我从未真正见过以这种方式有界的东西。这个语法是什么意思Comparator<? super E>

这是一个示例函数:

private <E> void sort(E[] array, Comparator<? super E>  cmp) {
   qsort(array, 0, array.length - 1, cmp);
}
4

3 回答 3

3

第一个<E>不是类型 - 它是类型约束。

请记住,Java 通过类型擦除实现泛型 - 这意味着此方法的运行时类型签名是

private void sort(Object[] array, Comparator cmp)

(通过删除 s 之间的所有内容<>)因此您的方法具有 return type void

意思<E>是说输入数组和比较器的类型是相关的:比较器需要能够比较 type 的“事物” E,但它实际上不必只处理确切类型的事物E

这就是这样<? super E>做的:例如,您可以有一个Comparator<CharSequence>,然后使用它来排序String[],因为String它是 的子类CharSequence

于 2015-07-26T14:13:07.183 回答
3

起初看起来好像函数应该返回<E>但后来我看到了void

<E>部分是为泛型方法提供其类型参数的语法。实际的返回类型是void.

这个语法是什么意思Comparator<? super E>

这意味着比较器可以用于E或用于它的任何超类。

于 2015-07-26T14:13:26.023 回答
2
Comparator<? super E>  

? 是通配符,其下限是 E。

例如:

private <E> void sort(E[] array, Comparator<? super E>  cmp)

如果你通过

qsort(array, 0, array.length - 1, cmp);

如果数组是 Number[]那么“?”的下限 设置为 java.lang.Number 即“?” 可以是 Number 的超类。

于 2015-07-26T14:12:17.517 回答