【问题标题】:Ensure that objects implement Comparable确保对象实现 Comparable
【发布时间】:2010-07-02 14:57:09
【问题描述】:

我有一个小问题,想知道如何解决它。我有一个通用类Tuple<A,B>,现在我想根据 A 和 B 对它们的元组进行排序。它应该如下所示:

未分类:

(1,5) (2,8) (6,8) (1,4) (2,4)

排序:

(1,4) (1,5) (2,4) (2,8) (6,8)

出于这个原因,我想在 Tuple 类中实现一个通用比较方法 (public int compareTo(Tuple<A, B> other))。唯一的问题是,您可以为类参数化的所有对象(例如 A=Integer、B=String)也必须实现 compareTo 方法才能使整个事情发挥作用。

有没有办法确保 Tuple 可以容纳的所有对象都实现 Comparable 接口?

或者对如何解决这个问题还有其他建议吗?

谢谢

【问题讨论】:

    标签: java generics compare


    【解决方案1】:

    如果你将类声明为

    public class Tuple<A extends Comparable<? super A>,
                       B extends Comparable<? super B>> { ...
    

    那么这确保了 A 和 B 都是可自比的。然后,您可以在类中的任何类型 A 或 B 的对象上调用 compareTo()

    【讨论】:

      【解决方案2】:

      您可以使用递归类型边界(另见 Effective Java 的第 27 条)来指定元组的组件扩展 Comparable,如下所示:

       public class Tuple<A extends Comparable<? super A>, B extends Comparable<? super A>> implements Comparable<Tuple<A, B>> {
          A valueA;
          B valueB;
      
          @Override
          public int compareTo(Tuple<A, B> tuple) {
              // Implement comparison logic
              return 0;
          }
      }
      

      这允许您为元组的组件(Tuple)指定不同的类型。

      【讨论】:

      • 我更喜欢 A extends Comparable&lt;? super A&gt;,但 +1 用于在元组本身上实现 Comparable。我应该记得的。
      • 您不应该使用A extends Comparable&lt;A&gt;... 这不适用于实现原始Comparable 的旧类等。 mmyers 与A extends Comparable&lt;? super A&gt; 的签名是正确的。
      • 啊,谢谢。我已经编辑了我的答案以免误导,并赞成 mmyers 的版本。
      • 嗯。当我尝试实现比较器时,出现错误:'The operator'
      【解决方案3】:

      这应该可以解决问题。您指定的任何类都必须扩展 Comparable。

      public class Tuple<? extends Comparable> {
      }
      

      【讨论】:

      • 我意识到你在没有看到元组的原始泛型声明的情况下写了这个,所以我不能怪你错过了 A 和 B 参数。但即便如此,还是会因为你没有参数化 Comparable 而引发警告。
      猜你喜欢
      • 1970-01-01
      • 2014-06-25
      • 2017-02-14
      • 1970-01-01
      • 2014-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多