【问题标题】:Implementing Comparable interface for a generic class with Type parameter使用 Type 参数为泛型类实现 Comparable 接口
【发布时间】:2020-11-07 02:33:25
【问题描述】:
public class ClassX<T> implements Comparable<ClassX<T>> {

   private T o;

   public ClassX(T o) {
       this.o = o;
   }

   public T getObject() {
       return o;
   }

   public void setObject(T o) {
       this.o = o;
   }

   @Override
   public int compareTo(ClassX<T> arg0) {
       return o.compareTo(arg0.o);
   }
}

如果我有这样的类并且我想实现 Comparable 接口,我读到我必须将 ClassX&lt;T&gt; 更改为 ClassX&lt;T extends Comparable&lt;T&gt;&gt;。但是,如果我还想将我的 ClassX 用于不实现 Comparable 接口的对象,我知道我将无法对这些对象使用方法 compareTo()?

【问题讨论】:

  • “如果我也想将我的 ClassX 用于不实现 Comparable 接口的对象怎么办” - 那么你将基本上违反Comparable 接口契约。
  • 所以你想要“Comparable 的条件实现”之类的东西?也就是说,ClassX&lt;T&gt; 将实现Comparable 当且仅当T 实现Comparable?我理解正确吗?
  • 一种(丑陋的)方法是尝试将T 转换为Comparable,如果失败,则抛出UnsupportedOperationException。 Java 中不存在条件实现。
  • @hfontanez 好吧,当您尝试对非Stream 的非Comparable 对象进行排序时,会发生类似的情况。如果Stream 使用这种方法,我会说在我们的代码中也可以使用它,尽管它很难看。
  • OP,既然你说你正在制作一个Pair 课程,我建议不要那样做。改为编写更具体的类。除其他外,它们更具前瞻性。

标签: java generics interface comparable


【解决方案1】:

另一个选项是,而不是实现Comparable,有一个返回Comparator 的静态方法,并且只有在满足T 的约束时才能调用此方法。那么您的ClassX 可以与不实现ComparableT 一起使用,但您只能通过实现TClassXs 获得Comparators 实现Comparable

public class ClassX<T> {
    private T o;

    // ...

    public static <T extends Comparable<? super T>> Comparator<ClassX<T>> getComparator() {
        return (x, y) -> x.o.compareTo(y.o);
    }
}

【讨论】:

    【解决方案2】:

    如何创建另一个层次结构来支持这一点:

    public class NonComparableClassX<T> implements Comparable<NonComparableClassX<T>> {
     // ....
    
      @Override
       public int compareTo(ClassX<T> arg0) {
         // throw Exception;
       }
    }
    
    public class ClassX<T> extends NonComparableClassX<T> {
     // ....
    
      @Override
       public int compareTo(ClassX<T> arg0) {
         // Implement comparables here
       }
    }
    
    

    这样你就可以把所有的对象封装成ClassX,如果需要也可以是NonComparableClassX类型

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多