我有一些排序方法,为了工作,他们需要接受一个定义了compareTo
的对象。
以下作为通用定义的一部分:
private static <SomeType extends Comparable<? super SomeType>>
void doSomeSort(SomeType[] a, int left, int right){
似乎可以解决问题。
我的问题是我真的不明白什么
<SomeType extends Comparable<? super SomeType>>
实际上定义了。
这意味着您可以替换一个类型,该类型是扩展Comparable的接口,该类型由其自身实例化。
我没有。
您能否帮助澄清这个定义?
答案 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;。