2015-02-10 45 views
1

我想實現Comparable接口「兩次」使Java類堪比2個不同的類

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

如果返回結果相同,爲什麼需要這樣實現? – 2015-02-10 09:57:30

回答

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方法這將是有益的。我不確定他們會從其他庫方法中調用什麼。

+0

嗯,我認爲這是一種討厭,但我會被迫做到這一點... – 2015-02-10 10:03:05

+0

爲什麼你認爲它的討厭?它比具有相同目的的兩種方法更加簡潔 – Saif 2015-02-10 10:04:14

+0

'可比較的'基本上保證會破壞['Comparable.compareTo()']的所有實現要求(https://docs.oracle.com/javase/8/docs /api/java/lang/Comparable.html#compareTo-T-)。 – shmosel 2016-01-05 00:48:44

0

如果您的Segment和Point都實現相同的接口,或者它們是Parent和Child,那麼您可以這樣做。

+0

你不能比較一隻貓和一隻狗! ;) – zatenzu 2015-02-10 10:00:08

+0

@ zatenzu他們都是動物,並且都有4條腿(大部分時間)。所以是的,這是可能的 – 2015-02-10 10:07:39

+0

@Vixen所以,他們實現了相同的界面,「動物」,你可以比較兩隻動物,但不能簡單地把一隻貓和一隻狗相比。 – zatenzu 2015-02-10 10:15:01

1

,如果你這樣做是爲了收集整理,然後用比較

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

這不是一個好主意,作爲一種設計模式。順便說一下,在Java中是不可能的,因爲由於類型擦除,Comparable和Comparable是相同的二進制接口。

無論如何,我會盡力解釋爲什麼我認爲這是一個壞主意。當你實現Comparable時,你正在定義一個所謂的「自然排序」,它是類本身固有的排序,是一種自然排序。這種排序應該涉及同一類的類和元素。所以,我認爲(這純粹是個人意見),你應該只實施Comparable與你正在實施的類相同。

如果你想比較段與點,這當然是一個完全合法的事情,只要你有一個明確的排序。你可以通過實現一個所謂的「外部比較器」來實現,即實現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); } 
}