Java:我根本不理解这个泛型定义

时间:2012-02-01 18:17:55

标签: java generics inheritance comparable

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

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

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

似乎可以解决问题。

我的问题是我真的不明白什么 <SomeType extends Comparable<? super SomeType>>

实际上定义了。
这意味着您可以替换一个类型,该类型是扩展Comparable的接口,该类型由其自身实例化。
我没有。

您能否帮助澄清这个定义?

5 个答案:

答案 0 :(得分:3)

这意味着:

  

SomeType是一个扩展Comparable<SomeType>Comparable<Any type that is a superclass or super interface of SomeType>

的类

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

答案 1 :(得分:1)

最终,你真正需要知道的是它意味着:

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

将编译。

更准确地说,这意味着SomeType为某些类型Comparable<T>实现了T,它位于SomeType的继承层次结构中...而无需指定T只是结果是上面的代码有效:)

答案 2 :(得分:1)

它转换为:

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

符合此模式的经典类型为Integer,因为它实现了Comparable<Integer>

答案 3 :(得分:1)

<SomeType extends Comparable<? super SomeType>>

Comparable始终是一种特殊的模板类型。 因此Comparable<String>可以与String进行比较,Comparable<BigInteger>可以与BigInteger进行比较,等等。

这里预期的SomeType来自Comparable<T>。意味着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());

答案 4 :(得分:0)

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

class Float extends Number implements Comparable<Float>

但实际上,我们的Float类比这更广泛。 float类知道如何将自己与Integers,Bignums,Doubles等进行比较。事实上,我们的float类知道如何将自身与* any(数字。

进行比较。
class Float extends Number implements Comparable<Number>
class Integer extends Number implements Comparable<Number>

事实上:任何数字类都需要这样做,所以真正的声明是真实的

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

现在,Comparable界面很酷。如果它不是通配符,则Floats和Integers将无法比较。

但既然如此,你可以去:

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

如果没有&gt;?你不能这样做超级T&gt;。