2012-02-01 74 views
1

我有一些排序方法,为了工作,他们需要接受定义了compareTo的对象。Java:我完全不明白这个泛型定义

以下的一般定义的一部分:

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

似乎这样的伎俩。

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

实际上定义。
这意味着你可以代表一个类型,它是一个接口,它扩展了它本身实例化的Comparable ...
我没有得到。

你能帮忙澄清这个定义吗?

+0

http://stackoverflow.com/questions/8422078/class-definition-class-name/8422157可能出现重复。 – Tudor 2012-02-01 18:27:51

回答

1

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

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

将编译。

更确切地说,它意味着SomeType实现Comparable<T>针对某些类型的T这是在SomeType继承层次......您无需指定T是什么,但其结果是,上面的代码工作:)

+0

但定义说'扩展Comparable'.Not'SomeType实现Comparable' – Cratylus 2012-02-01 18:31:30

+0

@ user384706:通用约束不使用'implements',就这样。哎呀,'SomeType' *可能是一个界面。 – 2012-02-01 18:33:30

1

它转换为:

  • 类型SomeType必须扩展或实现Comparable
  • Comparable本身,在这种情况下,需要一些类型作为参数,我们称之为T
  • 类型T必须是SomeType或超类SomeType

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

1
<SomeType extends Comparable<? super SomeType>> 

可比较始终是特殊的模板类型。 因此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()); 
+0

'? super SomeType'在继承层次结构中接受任何类*上面的* SuperType,而不是*下面*。 – 2012-02-01 18:30:13

+0

@JBNizet是的,对!显然是笔的一部分:/。我编辑它。 – poitroae 2012-02-01 18:38:09

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实例进行比较,那么排序将比较它们而不会出现问题。

0

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

class Float extends Number implements Comparable<Float> 

但是事实上,我们的Float类比这个更广泛。 Float类知道如何用自己整数,大数,双打,等等等等,其实,我们的浮动类就知道如何自己比较比较*任何(数字

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<Number> array[] = new Comparable<Number>[10]; 
array[0] = Float.getValue(10);  
array[1] = Integer.getValue(11); 
sort(array, 0, 1);  

你不能这样做,没有>?超T>。

+0

你的答案似乎与这里的概念非常接近,但有错误。即使你的示例代码是错误的。你不能这样做'可比较的 array [] = new ..'开头。 – Cratylus 2012-02-05 20:00:58