使java类可兼容2个不同的类

时间:2015-02-10 09:54:16

标签: java class comparable

我想实现Comparable Interface" 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)我觉得它很讨厌...)

5 个答案:

答案 0 :(得分:2)

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

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

如果你想用分数来比较分段,这当然是完全合法的,只要你有明确定义的顺序。您可以通过实现所谓的&#34;外部比较器&#34;来实现这一点,即实现Comparator<X>的类,其中X是PointSegment的公共超类。 Java标准类和函数准备始终接受可选的外部比较器,因为通常,您可能希望对同一类的对象具有不同的排序条件。

您似乎没有共同的基类/接口。也许你应该定义一个,毕竟它们都是几何实体。截至目前,您唯一能做的就是使用Comparator<Object>,然后使用instanceof运算符检查类型。这是很多样板代码,而且,我认为,糟糕的设计:因为你说点和段是可比较的,它们应该有一些你想要比较的共同属性。然后,这个属性应该成为一个公共基类或它们都实现的接口的方法(实际上,这可能会导致你再次使用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); }
}

答案 1 :(得分:1)

如果您正在进行Collection排序,请使用Comparator

/**
 * 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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

它具有int比较(T o1,T o2)而不是Comparable的compareTo。例如,如果要对集合进行排序,则可以使用:

Collections.sort(您的列表,您的新Comparator对象)

答案 4 :(得分:0)

为什么不尝试这种方式

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方法,这将非常有用。我不确定他们会从其他库方法中调用什么。