使 java class 可与 2 个不同的 类 相媲美

Make java class Comparable to 2 different Classes

我想实现 Comparable 接口 "Twice"

public class Segment implements Comparable<Segment,Point>{
@Override
public int compareTo(Segment o) {
    return 0;
}
@Override
public int compareTo(Point p) {
    return 0;
}

有可能吗? (不使用通用接口 compareTo(Object o) 我认为它很讨厌...)

如果你的 Segment 和 Point 都实现了相同的接口或者它们是父子,你可以这样做。

您只能实现一次 Comparable,但您可以多次使用 Comparator 接口 --> http://docs.oracle.com/javase/6/docs/api/java/util/Comparator.html

它有 int compare(T o1, To o2) 而不是 Comparable 的 compareTo。例如,如果您想对 collection 进行排序,那么您可以使用:

Collections.sort(您的列表,您的新比较器 object)

如果你正在做集合排序那么使用比较器

/**
 * Comparator implementation which sorts Person objects on person_id field
 */
public class SortByPerson_ID implements Comparator{

    public int compare(Object o1, Object o2) {
        Person p1 = (Person) o;
        Person p2 = (Person) o; 
        return p1.getPersonId() - p2.getPersonId();
    }
}

排序-

 Collections.sort(perSonlist, new SortByPerson_ID());

阅读更多:http://javarevisited.blogspot.com/2011/06/comparator-and-comparable-in-java.html#ixzz3RKoKZpB5

为什么不试试这个

public class Segment implements Comparable<Object>{
     @Override
     public int compareTo(Object o) {
         if(o instanceof Segment)
         {
              return 0;
         }
         else if(o instanceof Point)
         {
             return 0;
         }

     }
}

好吧,如果你真的想按照你的方式去做,那么你可以使用 overloading 添加另一种方法(不添加 @Override 注释)。

public class Segment implements Comparable<Segment>{
    @Override
    public int compareTo(Segment o) {
        return 0;
    }

    public int compareTo(Point p) {
       return 0;
    }
}

手动调用compareTo方法会有用。我不确定他们从其他一些库方法中调用会发生什么。

作为设计模式,这不是一个好主意。而且,顺便说一句,在Java中是不可能的,因为Comparable和Comparable由于类型擦除是相同的二进制接口。

无论如何,我会尝试解释为什么我认为这是个坏主意。当您实现 Comparable 时,您正在定义所谓的 "natural sorting",这是 class 本身固有的排序,一种自然排序。此排序应涉及 class 和相同 class 的元素。所以,我认为(这纯粹是个人意见)你应该只用与你正在实施的相同的 class 来实施 Comparable

如果你想比较线段和点,这当然是完全合法的事情,只要你有一个明确定义的顺序。您可以通过实施所谓的 "external comparator" 来实现,即实施 Comparator<X> 的 class,其中 X 是 PointSegment。 Java 标准 classes 和函数准备始终接受可选的外部比较器,因为通常,您可能希望对相同 class 的对象使用不同的排序标准。

你们似乎没有共同点class/interface。也许你应该定义一个,毕竟它们都是几何实体。到目前为止,您唯一可以做的就是使用 Comparator<Object>,然后使用 instanceof 运算符来检查类型。这是很多样板代码,而且,我认为,糟糕的设计:既然你说点和段是可比较的,那么它们应该有一些你希望比较的共同点 属性。然后这个 属性 应该成为公共基础 class 的方法或它们都实现的接口(实际上,这可能会导致您再次使用 Comparable,但以更简洁的方式)。

例如,假设您要根据坐标比较点和线段,并且希望在排序时考虑线段的中值。然后,您可以执行以下操作:

public abstract class GeometricEntity implements Comparable<GeometricEntity> {
  protected abstract Point getSortingPoint();
  @Override
  public int compareTo(GeometricEntity other) {
    //Compare by getSortingPoint
  }
}

public class Point implements GeometricEntity {
  @Override
  protected Point getSortingPoint() { return this; }
}

public class Segment implements GeometricEntity {
  private Point ptFrom;
  private Point ptTo;
  @Override
  protected Point getSortingPoint() { return meanPoint(ptFrom, ptTo); }
}