我对这种语法感到困惑,因为最初看起来好像函数应该返回<E>
,但后来我看到了void
。 <E>
之前void
的目的是什么?
另外,我对边界和泛型很熟悉,但我从来没有真正看到过这种方式。这种语法意味着什么Comparator<? super E>
?
以下是一个示例函数:
private <E> void sort(E[] array, Comparator<? super E> cmp) {
qsort(array, 0, array.length - 1, cmp);
}
答案 0 :(得分:3)
第一个<E>
不是类型 - 它是类型约束。
请记住Java通过类型擦除实现泛型 - 这意味着此方法的运行时类型签名是
private void sort(Object[] array, Comparator cmp)
(删除<>
之间的所有内容),以便您的方法返回类型为void
。
<E>
的作用是说输入数组和比较器的类型是相关的:比较器需要能够比较事物&#39; E
类型,但它实际上不必仅处理完全类型E
的内容。
这是<? super E>
的作用:例如,您可以拥有Comparator<CharSequence>
,然后使用它来排序String[]
,因为String
是CharSequence
的子类1}}。
答案 1 :(得分:3)
首先看起来好像该函数应该返回
<E>
但是我看到void
<E>
部分有一种语法,用于为通用方法提供类型参数。实际的返回类型是void
。
这种语法意味着什么
Comparator<? super E>
这意味着比较器可能用于E
或其任何超类。
答案 2 :(得分: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,即“?”可以是任何超级数字的东西。