1

我遇到了泛型类的以下定义:

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

请帮助解释为什么一个类在实现可比较接口时将自己指定为可比较的类型参数?它与以下内容有何不同:

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

3 回答 3

6

这使得可以相互比较binarysearchnodes。如果它实现Comparable<T>了,那将意味着该节点可以与该节点的进行比较,这将是奇怪的。

在类中,您可能会发现如下内容:

T value;

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

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

于 2012-12-29T17:09:14.933 回答
2

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

b1.compareTo(b2)

whereb1b2arebinarysearchnode实例。开发人员还添加了一个约束,T以便Textends Comparable<T>。可能这样 for 的实现Comparable只能binarysearchnode依赖于T实例Comparable本身。

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

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

  • 您将无法相互比较binarysearchnode<T>
  • 给定一个binarysearchnote<T>instanceb和一个Tinstance t,你可以写b.compareTo(t)但不能t.compareTo(b)(因为T没有也不能实现Comparable<binarysearchnode<T>>),这违反了Comparable合同。
于 2012-12-29T17:10:45.260 回答
2

假设您有一个 superclassA和一个 subclass B。想象一下超类实现了Comparable<A>,那么B也会Comparable<A>通过继承来实现。

您的 binarysearchnode 类声明如下:

public class binarysearchnode<T extends Comparable<T>>

将不能B作为TB不实现Comparable<B>)的类型参数但是当这样定义时:

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

它将能够B作为 的类型参数T,因为B实现Comparable<A>Comparable<? super T>.

于 2012-12-29T19:33:28.350 回答