【问题标题】:Java: I don't understand this generics definition at allJava:我根本不理解这个泛型定义
【发布时间】:2018-02-04 19:50:30
【问题描述】:

我有一些排序方法,为了工作,它们需要接受一个定义了compareTo 的对象。

以下作为通用定义的一部分:

private static <SomeType extends Comparable<? super SomeType>> 
    void  doSomeSort(SomeType[] a, int left, int right){

似乎可以解决问题。

我的问题是我不太明白
&lt;SomeType extends Comparable&lt;? super SomeType&gt;&gt;

实际定义。
这意味着您可以替换一个接口类型,该接口扩展了 Comparable 自身实例化的接口...
我不明白。

您能帮忙澄清一下这个定义吗?

【问题讨论】:

标签: java generics inheritance comparable


【解决方案1】:

这意味着:

SomeType 是一个扩展 Comparable&lt;SomeType&gt;Comparable&lt;Any type that is a superclass or super interface of SomeType&gt; 的类。

? super SomeType 的原因是,如果 SomeType 能够将自身与其他 SomeType 实例进行比较,则排序过程能够对 SomeType 实例数组进行排序。如果 SomeType 扩展了 SomeSuperType,并且任何 SomeSuperType 实例都能够将自己与其他 SomeSuperType 实例进行比较,那么排序将毫无问题地比较它们。

【讨论】:

    【解决方案2】:

    归根结底,您真正需要知道的只是它的含义:

    SomeType x = ...;
    SomeType y = ...;
    int comparison = x.compareTo(y);
    

    将编译。

    更准确地说,这意味着SomeType 实现了T 的某种类型Comparable&lt;T&gt;,它在SomeType 的继承层次结构中......而您不必指定T 是什么,但结果是上面的代码有效:)

    【讨论】:

    • 但定义上写着extends Comparable.Not SomeType implements Comparable
    • @user384706:通用约束不使用implements,仅此而已。哎呀,SomeType可能是一个接口。
    【解决方案3】:

    翻译成:

    • 类型SomeType必须扩展或实现Comparable
    • Comparable本身,在这种情况下,将某种类型作为参数,我们称之为T
    • 类型T 必须是SomeTypeSomeType 的超类。

    符合这种模式的经典类型是Integer,因为它实现了Comparable&lt;Integer&gt;

    【讨论】:

      【解决方案4】:
      <SomeType extends Comparable<? super SomeType>>
      

      Comparable 总是一个特殊的模板类型。 所以Comparable&lt;String&gt; 可以与String 进行比较,Comparable&lt;BigInteger&gt; 可以与BigInteger 进行比较,等等。

      这里预期的是一个派生自Comparable&lt;T&gt;SomeType。这意味着SomeType 与其他实例相当。最琐碎的事情是

      <SomeType extends Comparable<SomeType>>
      

      到目前为止应该很清楚。 现在添加的所有内容都是一个简单的super 关键字。 这意味着, SomeType 需要与 SomeType 类型的所有内容或派生层次结构中的任何内容具有可比性。 这基本上有一个优点:您以后可以从 SomeType 派生您自己的/其他类型,并且此方法仍将向下兼容! 太棒了,嗯?

      例如:

      class SomeTypeSuper { ... }
      class SomeType extends SomeTypeSuper { ... }    
      
      // Now, in your code both is valid:
      // Asuming the method `yourMethod` expects a `<SomeType extends Comparable<? super SomeType>>` as parameter.
      
      yourMethod(new SomeTypeSuper()); // This wouldn't be valid if we had used Comparable<SomeType>
      yourMethod(new SomeType());
      

      【讨论】:

      • ? super SomeType 接受继承层次结构中的任何 above SuperType 类,而不是 below
      • @JBNizet 是的,正确的!显然是笔误:/。我编辑了它。
      【解决方案5】:

      Float 是 Number 的子类。我们可以这样声明:

      class Float extends Number implements Comparable<Float>
      

      但事实上,我们的 Float 类远不止于此。 float 类知道如何将自己与 Integers、Bignums、Double 等进行比较。事实上,我们的 float 类知道如何将自己与 *any( number.

      class Float extends Number implements Comparable<Number>
      class Integer extends Number implements Comparable<Number>
      

      其实:any number 类都需要这样做,所以真正的声明sare

      class Number implements Comparable<Number>
      class Integer extends Number
      class Float extends Number
      

      现在,Comparable 界面很酷。如果不使用通配符,则浮点数和整数将无法具有可比性。

      不过既然如此,你可以去:

      Comparable<Number> array[] = new Comparable<Number>[10];
      array[0] = Float.getValue(10);     
      array[1] = Integer.getValue(11);
      sort(array, 0, 1);     
      

      如果没有 >,你不能这样做吗?超级T>。

      【讨论】:

      • 您的回答似乎与此处的概念非常接近,但有错误。即使您的示例代码也是错误的。您不能从Comparable&lt;Number&gt; array[] = new ..开始。
      猜你喜欢
      • 2014-01-12
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 2017-04-29
      相关资源
      最近更新 更多