java通用可比成语

时间:2012-12-29 17:00:32

标签: java generics comparable

我遇到了以下通用类的定义:

public class binarysearchnode<T extends Comparable<T>> implements Comparable<binarysearchnode<T>>{
.............
}

请帮助解释为什么在实现类似的界面时,类会将自己指定为Type参数以进行比较? 它与以下内容有何不同:

public class binarysearchnode<T extends Comparable<T>> implements Comparable<? super (or extends)T>{
.............
}

3 个答案:

答案 0 :(得分:6)

这使得可以将binarysearchnode彼此进行比较。如果它实现了Comparable<T>,那么这意味着可以将节点与节点的进行比较,这将是奇数。

在课堂上你可能会发现这样的事情:

T value;

public int compareTo(binarysearchnode<T> other) {
   return value.compareTo(other.value);
}

为了能够像这样实现compareTo(),值类(T)需要与其类的其他对象相比 - 因此在<T extends Comparable<T>>中声明课程定义。

答案 1 :(得分:2)

这是因为班级作者想要写的是:

b1.compareTo(b2)

其中b1b2binarysearchnode个实例。开发人员还T 添加约束,以便T扩展Comparable<T>。可能是因为Comparable binarysearchnode的实施可能只依赖于TComparable个实例。

更一般地说,虽然类C1可以实现Comparable<C2>,但最终这样做是没有意义的:这并不意味着C2的实例可以与C1的实例相当。由于类型擦除,例如,类C1无法实现 Comparable<C1>Comparable<C2>

此外,如果binarysearchnode<T>直接实施Comparable<T>,您至少会遇到两个问题:

  • 您将无法将一个binarysearchnode<T>与另一个进行比较;
  • 给定binarysearchnote<T>实例bT实例t,您可以写b.compareTo(t)但不能t.compareTo(b)(从那以后) T没有,也无法实施Comparable<binarysearchnode<T>>),这违反了Comparable合同。

答案 2 :(得分:2)

假设你有一个超类A和一个子类B。想象一下,超类实现Comparable<A>,然后B也将通过继承实现Comparable<A>

您的binarysearchnode类声明为:

public class binarysearchnode<T extends Comparable<T>>

将无法将B作为T的类型参数(B未实现Comparable<B>) 但定义如下:

public class binarysearchnode<T extends Comparable<? super T>>

它可以将B作为T的类型参数,因为B实现了Comparable<A>的{​​{1}}。