-1

したがって、同じメソッドの 2 つのバージョンがあります。

バージョン 1:

public static <T> int countGreaterThan(T[] anArray, T elem) 
    {
        int count = 0; 
        for (T e : anArray)
        {
            if (e > elem)
                count++;
        }
        return count;
    }

バージョン 2:

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;
    }

> 演算子はプリミティブを比較する場合にのみ使用できるため、 Eclipse はバージョン 1について文句を言います。これは私には理にかなっています。

したがって、この問題を解決するには、Comparable インターフェースによって境界付けられた型パラメーターを使用するようにインターネットから指示されます。ここから、何が起こっているのか分からなくなり始めます...

インターフェイスに関する私の基本的な理解から、インターフェイスを実装するクラスは、インターフェイスで宣言された各メソッドのメソッド本体を提供する必要があります。

では、なぜバージョン 2はこのように見える必要がないのでしょうか?

public int compareTo(T o)
    {
        //stuff for method body
    }


    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;
    }

^これは正しい構文ではないと思いますが、この状況で Comparable インターフェースのメソッドのメソッド本体を記述する必要がない理由についての質問を説明するためにこれを行いました。

素人の言葉で説明を続けるようにしてください。私はこのことを独学で学んできたので、簡単な説明は、トピックをさらに調査するときに、トピックのより技術的な側面を理解するのに役立ちます.


混乱してすみません、はっきりさせてください。

Comparable インターフェイスのコードは次のとおりです。

public interface Comparable<T> {
   public int compareTo(T o);
     }

インターフェイスであるため、compareTo() のメソッド本体はありません。countGreaterThan() メソッドでインターフェイスを使用できるように、compareTO() の本体を手動で記述する必要がないのはなぜですか?

インターフェイスが Java Collections Framework の一部であるためですか (それが理由である場合は、それがどのように機能するかを説明してください)

独自のインターフェイスを作成する別の状況を次に示します。

public interface Dance { //an interface
  public void boogie(int count);
}

そのインターフェイスをさまざまなクラスに実装するには、ダンス インターフェイスのメソッドのメソッド本体をそれらのクラスに記述する必要があります。

public class theMoonwalk implements Dance {
  public void boogie(int count) {
    System.out.println("Slide " + count + " times!");
  }
  public void mJ() {
    System.out.println("Michael Jackson did this dance!");

}
public class theHustle implements Dance {
  public void boogie(int steps) {
    System.out.println("Step " + steps + " times!");
  }
}
public class theJitterBug implements Dance {
  public void boogie(int twists) {
    System.out.println("Twist " + twists + " times!");
  }
}

compareTo() のメソッド本体を作成する必要がないのはなぜですか (メソッド本体が compareTo() の Comparable インターフェイスに含まれていないため)。

4

1 に答える 1

3

T最終的に参照する型は、バインドされた型を宣言しているクラスではなく、実装するComparable<T>必要があります。

少し簡単にするために、countGreaterThanメソッドを使用するには、配列とelem引数に含まれるオブジェクトはすべてオブジェクトでなければなりませんComparable

これは、次のような呼び出しが受け入れられることを意味します。

Integer[] foo = {1, 2, 3, 4, 5};
YourClass.countGreaterThan(foo, 2);

Integerあなたの型は、および にバインドされてInteger implements Comparable<Integer>います。

これは受け入れられません:

Object[] bar = {new Object(), new Object(), new Object()};
YourClass.countGreaterThan(bar, new Object());

あなたの型は にバインドされてObjectおり、 をObject実装していませんComparable。実装するカスタム オブジェクトにも同じロジックが適用されます。Comparable にバインドされていない場合、適切なバインドにはなりません。

于 2015-06-02T15:44:35.550 に答える