2017-06-04 15 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; 

} 

私もそれを定義せずに、インタフェースのメソッドを使用することができるよということに来ますか?

すでに質問に答えがあった場合、私の謝罪はそれを見つけることができませんでした。

Thx。

+1

これは 'anArray'のオブジェクトのクラスで定義されています。 –

答えて

4

T[]の配列の要素は、Comparable<T>(型バインド<T extends Comparable<T>>の結果として)を実装する何らかの型である必要があります。したがって、配列の要素に対してcompareTo()を呼び出すことができます。

compareToが実装されている場所は、あなたのメソッドに渡す配列によって異なります。たとえば、String[]を渡した場合、StringクラスのcompareToメソッドが使用されます。あなたのコードに

+1

皆、感謝しています。 – Mark

0

:あなたはあなたの署名内の「同等」のサブクラスとして型Tを定義している、あなたは「T」の配列を渡すと、それがパラメータ内で使用されている

(T [ ])。コンパイラは、Tが少なくともComparableでなければならないことを知っています。

詳細情報:

一般的に、私は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; 
     } 

    } 


} 

同等インターフェイスでの問題は、オブジェクトの特定の比較を決めたら、あなたは永遠にそこにバインドされているということです。あなたはそれを変更するかもしれませんが、すべての文脈が同じ消去を持っているかどうかわからないので、副作用を期待して、変更する必要があります。

関連する問題