【问题标题】:Understanding QuickSort Syntax了解快速排序语法
【发布时间】:2015-10-16 17:44:18
【问题描述】:

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

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

这是一个示例函数:

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

【问题讨论】:

  • "&lt;E&gt; 在 void 之前的用途是什么?"它表明它是一种通用方法。 “这个语法是什么意思Comparator&lt;? super E&gt;?”见docs.oracle.com/javase/tutorial/java/generics/lowerBounded.html
  • @JonSkeet 谢谢,乔恩。该语法是可选的吗?
  • @inquisitor 当你想知道 Java 的某些特性时,比如泛型,只需谷歌搜索“Java 教程”(在本例中为“Java 泛型教程”),然后得到第一个结果通常是正确的。 Java教程包含详细的解释,充满示例。
  • @JBNizet 谢谢你。我最初不确定如何通过谷歌搜索答案,主要是因为它与 sytnax 相关。但你是对的,将来会这样做。

标签: java syntax quicksort bounding


【解决方案1】:
Comparator<? super E>  

?是通配符,它​​的下限是 E。

例如:

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

如果你通过了

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

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

【讨论】:

    【解决方案2】:

    第一个 &lt;E&gt; 不是类型 - 它是类型约束。

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

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

    (通过删除&lt;&gt;s 之间的所有内容)因此您的方法具有返回类型void

    &lt;E&gt; 所做的就是说输入数组和比较器的类型是相关的:比较器需要能够比较 E 类型的“事物”,但它实际上不必只处理确切类型E的东西。

    这就是&lt;? super E&gt; 所做的:例如,您可以有一个Comparator&lt;CharSequence&gt;,然后使用它对String[] 进行排序,因为StringCharSequence 的子类。

    【讨论】:

      【解决方案3】:

      起初看起来函数应该返回&lt;E&gt;,但后来我看到void

      &lt;E&gt; 部分有一种语法,用于为泛型方法提供其类型参数。实际返回类型为void

      这个语法是什么意思Comparator&lt;? super E&gt;

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

      【讨论】:

        猜你喜欢
        • 2022-10-06
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多