Java 爪哇:我不知道';我根本不理解泛型的定义

Java 爪哇:我不知道';我根本不理解泛型的定义,java,generics,inheritance,comparable,Java,Generics,Inheritance,Comparable,我有一些排序方法,为了工作,它们需要接受一个定义了compareTo的对象 以下为通用定义的一部分: private static <SomeType extends Comparable<? super SomeType>> void doSomeSort(SomeType[] a, int left, int right){ private static最终,您真正需要知道的是,它意味着: SomeType x = ...; SomeType y = .

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

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

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

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

SomeType x = ...;
SomeType y = ...;
int comparison = x.compareTo(y);
将编译


更准确地说,这意味着
SomeType
SomeType
的继承层次结构中的某个类型
T
实现了
compariable
。。。您不必指定
T
是什么,但结果是上面的代码可以工作:)

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

SomeType x = ...;
SomeType y = ...;
int comparison = x.compareTo(y);
将编译

更准确地说,这意味着
SomeType
SomeType
的继承层次结构中的某个类型
T
实现了
compariable
。。。不必指定
T
是什么,但结果是上面的代码可以工作:)

它转换为:

  • 类型
    SomeType
    必须扩展或实现类
    可比性
  • Comparable
    本身,在本例中,将某种类型作为参数,我们称之为
    T
  • 类型
    T
    必须是
    SomeType
    SomeType
    的超类
适合此模式的经典类型是
Integer
,因为它实现了
compariable

,它转换为:

  • 类型
    SomeType
    必须扩展或实现类
    可比性
  • Comparable
    本身,在本例中,将某种类型作为参数,我们称之为
    T
  • 类型
    T
    必须是
    SomeType
    SomeType
    的超类
适合此模式的经典类型是
Integer
,因为它实现了
Comparable

到现在为止应该是清楚的。 现在添加的所有内容都是一个简单的
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());
class SomeTypeSuper{…}
类SomeType扩展了SomeTypeSuper{…}
//现在,在您的代码中,两者都是有效的:
//Asuming方法'yourMethod'需要一个`
到现在为止应该是清楚的。
现在添加的所有内容都是一个简单的
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());
class SomeTypeSuper{…}
类SomeType扩展了SomeTypeSuper{…}
//现在,在您的代码中,两者都是有效的:
//使用“yourMethod”方法需要一个“,这意味着:

SomeType是扩展
Comparable
Comparable
的类


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

这意味着:

SomeType是扩展
Comparable
Comparable
的类


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

Float是Number的子类。我们可以这样宣布:

class Float extends Number implements Comparable<Float>
类浮点扩展了可比较的
但事实上,我们的Float类远不止这些。float类知道如何将自己与整数、Bignums、double等进行比较。事实上,我们的float类知道如何将自己与*any(数字)进行比较

类浮点扩展了可比较的
类Integer扩展了实现可比较的数
事实上:任何数字类都需要这样做,所以真正的声明是

class Number implements Comparable<Number>
class Integer extends Number
class Float extends Number
类号实现可比性
类整数扩展数字
类浮点扩展数字
现在,Compariable接口很酷。如果它没有通配符,那么浮点和整数就不能进行比较

但既然是这样,你可以:

Comparable<Number> array[] = new Comparable<Number>[10];
array[0] = Float.getValue(10);     
array[1] = Integer.getValue(11);
sort(array, 0, 1);     
Comparable array[]=新的Comparable[10];
数组[0]=Float.getValue(10);
数组[1]=Integer.getValue(11);
排序(数组,0,1);

如果没有>?super t>

Float是Number的子类,则无法执行此操作。我们可以这样声明:

class Float extends Number implements Comparable<Float>
类浮点扩展了可比较的
但事实上,我们的Float类比这要广泛得多。Float类知道如何将自己与整数、Bignums、double等进行比较。事实上,我们的Float类知道如何将自己与*any(数字)进行比较

类浮点扩展了可比较的
类Integer扩展了实现可比较的数
事实上:任何数字类都需要这样做,所以真正的声明是

class Number implements Comparable<Number>
class Integer extends Number
class Float extends Number
类号实现可比性
类整数扩展数字
类浮点扩展数字
现在,Compariable接口很酷。如果它没有通配符,那么浮点和整数就不能进行比较

但是s