int compare(Object o1,Object o2) 比較它的兩個參數的順序。Java接口比較器靜態比較
對於比較兩個對象O1和O2需要做這樣的事情:
MyClass o1=new MyClass();
MyClass o2=new MyClass();
if (o1.compare(o1,o2)>0) ......
爲什麼這個methtod不是一成不變的? 如果方法是靜態的可能,如:
if (MyClass.compare(o1,o2)>0) ....
int compare(Object o1,Object o2) 比較它的兩個參數的順序。Java接口比較器靜態比較
對於比較兩個對象O1和O2需要做這樣的事情:
MyClass o1=new MyClass();
MyClass o2=new MyClass();
if (o1.compare(o1,o2)>0) ......
爲什麼這個methtod不是一成不變的? 如果方法是靜態的可能,如:
if (MyClass.compare(o1,o2)>0) ....
如果它是靜態的,怎麼會多態叫什麼名字? Comparator
的要點在於,您可以將實例傳遞到類似sort
...之類的位置,然後必須在比較實例上調用比較方法。
如果一個類是能夠比較本身到另一個實例,它應該實現Comparable
代替,所以你會寫:
if (o1.compareTo(o2))
你的問題顯示了缺乏Comparable
和Comparator
理解。
A Comparator
能夠比較兩個其他對象;
MyClass o1 = new MyClass();
MyClass o2 = new MyClass();
MyComparator c1 = new MyComparator();
if (c1.compare(o1, o2) > 0) {
...
}
東西是Comparable
能夠被相對於其他對象;
MyClass o1 = new MyClass();
MyClass o2 = new MyClass();
if (o1.compareTo(o2)) > 0) {
...
}
這是比較比較比較罕見,所以你的例子;
if (o1.compare(o1, o2) > 0) {
...
}
確實沒有意義。無論如何,在答案中,爲什麼不是compareTo()
是靜態的?基本上,Comparator
是一個接口,接口不能有靜態方法。爲什麼?那麼,這對他們沒有意義。一個接口是關於定義一個合同,但沒有提供實現。
約翰的答案很好,除非空指針是可能的。如果你想支持空指針,一個選項是在一些Util類上定義一個靜態方法
// null pointers first
public static int compareTo(@Nullable Comparable v1, @Nullable Comparable v2)
{
return v1 == null ? (v2 == null ? 0 : -1) : v2 == null ? 1 : v1.compareTo(v2);
}
// null pointers last
public static int compareTo(@Nullable Comparable v1, @Nullable Comparable v2)
{
return v1 == null ? (v2 == null ? 0 : 1) : v2 == null ? -1 : v1.compareTo(v2);
}
喬恩的回答是對的,但你的觀點是好的。從理論上講,如果每一個可比較的類都有一個靜態的「比較」方法,但是沒有辦法通過一個接口強制執行這個方法,那將是很方便的。 –