2017-06-04 215 views
1

目前我正在試圖找出java的接口「Comparable」是如何工作的。 據我所知inteface不能有任何非靜態(除了默認的)方法,所以當我們實現一個接口時,我們需要首先定義它的方法。java compareTo方法實現

但是當我實現「Comparable」接口時,我顯然可以使用它的compareTo方法。該方法定義在哪裏?

public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) { 

    int count = 0; 

    for (T e : anArray) 
     if (e.compareTo(elem) > 0) 
      ++count; 
    return count; 

} 

怎麼說,我能使用的界面的方法,甚至沒有定義呢?

我的apoligies如果已經有一個問題的答案,但無法找到它。

Thx。

+1

它在'anArray'中的對象的類中定義。 –

回答

4

T[]數組的元素必須是某種類型的實現Comparable<T>(作爲<T extends Comparable<T>>類型綁定的結果)。因此,您可以在該陣列的元素上調用compareTo()

compareTo其中compareTo取決於您傳遞給您的方法的數組。例如,如果您通過String[],則將使用String類的compareTo方法。

+1

這一切都有道理,謝謝大家。 – Mark

0

你的代碼:

您已經定義的類型T作​​爲一個子類的簽名中「媲美」,當你在「T」的數組傳遞給它的參數範圍內使用(T [ ])。編譯器現在知道任何T必須至少是一個Comparable。

更多信息:

總的來說,我不建議直接實現媲美。原因是比較總是在你不知道的背景下。

您應該在Comparable接口上使用Comparator接口來實現與特定上下文的比較。如果你想定義一個自然順序,你可以提供一個自然比較器作爲公共常量。

一些例子:

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.Comparator; 
import java.util.List; 

public class ComparatorExample { 


    public static void main(String[] args) { 

     List<SomeObject> list = new ArrayList<>(); 

     list.add(new SomeObject(1, "dhjf", "A")); 
     list.add(new SomeObject(4, "ghdg", "A")); 
     list.add(new SomeObject(6, "uztzt", "B")); 
     list.add(new SomeObject(1, "jhgf", "C")); 
     list.add(new SomeObject(3, "vbbn", "A")); 
     list.add(new SomeObject(99, "cvcxc", "A")); 
     list.add(new SomeObject(2, "dfdd", "G")); 

     // examples 

     Collections.sort(list, SomeObject.NATURAL); 
     Collections.sort(list, LexicographicOrderByCategoryAndName.INSTANCE); 
     LexicographicOrderByName.INSTANCE.compare(new SomeObject(99, "cvcxc", "A"), new SomeObject(54, "fdjnn", "C")); 

    } 


    public static class SomeObject { 

     public static Comparator<SomeObject> NATURAL = new Comparator<SomeObject>() { 

      @Override 
      public int compare(SomeObject arg0, SomeObject arg1) { 
       return arg1.getId() - arg0.getId(); 
      } 

     }; 

     private int id; 
     private String name; 
     private String category; 


     public SomeObject(int id, String name, String category) { 
      this.id = id; 
      this.name = name; 
      this.category = category; 
     } 

     public int getId() { 
      return id; 
     } 

     public String getName() { 
      return name; 
     } 

     public String getCategory() { 
      return category; 
     } 

    } 

    public static class LexicographicOrderByName implements Comparator<SomeObject> { 

     public static LexicographicOrderByName INSTANCE = new LexicographicOrderByName(); 

     private LexicographicOrderByName() { 
     } 

     @Override 
     public int compare(SomeObject o1, SomeObject o2) { 
      return o1.getName().compareTo(o2.getName()); 
     } 

    } 


    public static class LexicographicOrderByCategoryAndName implements Comparator<SomeObject> { 

     public static LexicographicOrderByCategoryAndName INSTANCE = new LexicographicOrderByCategoryAndName(); 

     private LexicographicOrderByCategoryAndName() { 
     } 

     @Override 
     public int compare(SomeObject o1, SomeObject o2) { 

      int c = o1.getCategory().compareTo(o2.getCategory()); 

      if (c == 0) { 
       c = o1.getName().compareTo(o2.getName()); 
      } 

      return c; 
     } 

    } 


} 

與可比接口問題是,一旦你決定一個對象的具體比較,你永遠綁定到它。你可能會改變它,但期望副作用,因爲你不知道所有的上下文是否具有相同的擦除並且應該改變。