【问题标题】:java generic comparable idiomjava泛型比较成语
【发布时间】:2012-12-29 17:00:32
【问题描述】:

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

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

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

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

【问题讨论】:

  • 因为它可以与自身的另一个实例相比较,而不是任何随机的其他事物。查看实际的compareTo() 方法,这应该很清楚。

标签: java generics comparable


【解决方案1】:

这使得将binarysearchnodes 相互比较成为可能。如果它实现了Comparable&lt;T&gt;,那反而意味着可以将节点与节点的进行比较,这将是奇怪的。

在类里面你可能会发现这样的东西:

T value;

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

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

【讨论】:

    【解决方案2】:

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

    b1.compareTo(b2)
    

    其中b1b2binarysearchnode 实例。开发人员还将约束添加到T,以便T 扩展Comparable&lt;T&gt;。可能是这样,Comparablebinarysearchnode 的实现可以只依赖于 T 实例本身就是 Comparable

    更一般地说,虽然 C1 类可以实现 Comparable&lt;C2&gt;,但最终这样做是没有意义的:这并不意味着 C2 的实例可以与C1。而且由于类型擦除,例如,类 C1 不可能实现 both Comparable&lt;C1&gt;Comparable&lt;C2&gt;

    另外,如果binarysearchnode&lt;T&gt; 直接实现Comparable&lt;T&gt;,你至少会遇到两个问题:

    • 您无法将一个 binarysearchnode&lt;T&gt; 与另一个进行比较;
    • 给定一个binarysearchnote&lt;T&gt;实例b和一个T实例t,你可以写b.compareTo(t)但不能写t.compareTo(b)(因为T没有也不能实现@987654349 @),这违反了Comparable 合同。

    【讨论】:

      【解决方案3】:

      假设您有一个超类A 和一个子类B。想象一下超类实现了Comparable&lt;A&gt;,那么B也会通过继承实现Comparable&lt;A&gt;

      您的 binarysearchnode 类声明如下:

      public class binarysearchnode<T extends Comparable<T>>
      

      将无法将B 作为T 的类型参数(B 未实现Comparable&lt;B&gt;) 但是当这样定义时:

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

      它将能够将B 作为T 的类型参数,因为B 实现了满足Comparable&lt;? super T&gt;Comparable&lt;A&gt;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        • 2011-01-15
        • 1970-01-01
        相关资源
        最近更新 更多