我想实现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)我觉得它很讨厌...)
答案 0 :(得分:2)
这不是一个好主意,作为一种设计模式。顺便说一下,在Java中是不可能的,因为由于类型擦除,Comparable和Comparable是相同的二进制接口。
无论如何,我会试着解释为什么我认为这是一个坏主意。当您实现Comparable
时,您正在定义一个所谓的&#34;自然排序&#34;,这是类本身固有的排序,一种自然排序。这种排序应该涉及同一类的类和元素。因此,我认为(这纯粹是个人意见),您应该只使用与您正在实施的类相同的类来实现Comparable
。
如果你想用分数来比较分段,这当然是完全合法的,只要你有明确定义的顺序。您可以通过实现所谓的&#34;外部比较器&#34;来实现这一点,即实现Comparator<X>
的类,其中X是Point
和Segment
的公共超类。 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
方法,这将非常有用。我不确定他们会从其他库方法中调用什么。