4
 1  class test {
 2      public static int compare0(Comparable x, Comparable y) {
 3          return x.compareTo(y);
 4      }

 5      public static int compare1(Object x, Object y) {
 6          return ((Comparable) x).compareTo((Comparable) y);
 7      }

 8      public static int compare2(Object x, Object y) {
 9          Comparable p = (Comparable) x;
10          Comparable q = (Comparable) y;
11          return (p).compareTo(q);
12      }

13      public static void main(String[] args) {
14          Comparable zero = new Integer(0);
15          Comparable one = new Integer(1);
16          int c = (zero).compareTo(one);
17      }
18  }

上記のコードをコンパイルすると、次の 4 つの警告が生成されます。

% javac -Xlint:unchecked test.java
test.java:3: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return x.compareTo(y);
                      ^
test.java:7: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return ((Comparable) x).compareTo((Comparable) y);
                                     ^
test.java:13: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    return (p).compareTo(q);
                        ^
test.java:19: warning: [unchecked] unchecked call to compareTo(T) as a member of the raw type java.lang.Comparable
    int c = (zero).compareTo(one);
                            ^
4 warnings

さらに多くの亜種を試しましたが、警告は残ります。上記の test.compare メソッドを記述して呼び出す正しい方法は何ですか?

ありがとう!

PS: test.compare は単なる例です。そのような機能は必要ありません。しかし、test.compare のように、署名に Comparable-implementing オブジェクトが必要な関数を実装する必要があります。

PS2: 私は 25 年以上プログラミングをしており、約 10 年前に Java をプログラミングしたこともありますが、現在 Java を使用している (私の仕事で必要とされている) ことは私を凶暴に駆り立てています。経験豊富なプログラマにとって、Java の学習は見た目よりもはるかに困難です。Java の学習に関するものはたくさんありますが、その 99% はせいぜい時代遅れであるか、プログラミングの初心者をランク付けするために売り込まれています (つまり、非常に冗長です)。最悪の場合、まったくのゴミです...上記の質問に対する答えをすぐにゼロにできる Java。

4

4 に答える 4

6

Comparableジェネリックです - で変数を定義する必要がありますComparable<Integer>

于 2011-08-03T20:42:09.650 に答える
6

compareジェネリック引数を使用してメソッドを宣言する必要があります。

public class ThisTest
{
    public static <T extends Comparable<T>> int compare(T x, T y) {
        if (x == null) 
            return -(y.compareTo(x));
        return x.compareTo(y);
    }

    public static void main()
    {
        // Type inferred
        int c = compare(Integer.valueOf(0), Integer.valueOf(1));
        // Explicit generic type parameter
        c = ThisTest.<Integer>compare(Integer.valueOf(0), Integer.valueOf(1));
    }
}
于 2011-08-03T20:51:36.243 に答える
2

本当の問題は、静的メソッド内で比較を行おうとしていることです。比較を行うメソッドを非静的にし、1 つ以上の「テスター」オブジェクトをインスタンス化し、それぞれの型にコミットします。例えば:

 test<String> strTester = new test<String>();

次に、String オブジェクトの比較メソッドを呼び出します。

 int retCode = strTester.comp(a, b)

整数などの他のタイプのオブジェクトを比較する場合は、次のような新しいテスター オブジェクトが必要になります。

 test<Integer> intTester = new test<Integer>();

これを行う場合は、次の行に沿ってクラスを定義できます。

 class test<T extends Comparable<T>> {
      public int comp(T x, T y) {
           ...
      }
 }
于 2012-12-11T17:56:45.723 に答える
1

生の型ではなく、zeroandoneを宣言しIntegerます。Comparable<Integer>

Angelika Langer は、ジェネリックに関する優れたリファレンスを作成しました。階層的な FAQ として編成されており、ほとんどのジェネリック型の問題に対する特定の回答をすばやく見つけることができます。この場合、生の型に関するセクションが役立つことがあります。

于 2011-08-03T20:57:27.873 に答える