3

Javaでは、ジェネリックスを使用して、同じタイプの2つのComparableオブジェクトをパラメーターとして受け取り、大きい方のオブジェクトを返すmax関数を作成するにはどうすればよいですか?

私は試した:

public static <T extends Comparable> T max(T obj1, T obj2)
{
    return ( ((obj1).compareTo(obj2) >= 0) ? obj1 : obj2);
}

(両方が等しい場合はobj1を返します。)

この方法は、 http://www.informit.com/articles/article.aspx?p = 170176&seqNum= 3で見つけたコードに基づいています。

ただし、コンパイルすると、次の警告が表示されます(-Xlint:uncheckedでコンパイル):warning:[unchecked]未加工のタイプjava.lang.ComparableのメンバーとしてのcompareTo(T)へのチェックされていない呼び出し

4

3 に答える 3

11

これは、生の型Comparableを使用しているために発生します。また、compareToはComparableの型パラメーターを使用するため、コンパイラーは比較対象を確認できません。Comparableもパラメータ化する必要があります。

public static <T extends Comparable<? super T>> T max(T obj1, T obj2)

? super Tを実装するクラスBを拡張するクラスAがあるかもしれないがComparable<B>、Aは実装しないので、を使用する必要がありますComparable<A>。したがって、最大2つのAオブジェクトを渡すことができ、Bが一致するため、Aオブジェクトに対してもBで定義され? super Aたメソッドを呼び出すことができます。compareTo2つのAオブジェクトを使用<T extends Comparable<T>>して渡そうとすると、コンパイルは、BからメソッドComparable<A>を継承していても、それらが実装されていないと文句を言います。compareTo

于 2010-07-27T20:51:34.673 に答える
6

GuavaのMethodmaxOf Ordering Class Ordering.max(a、b)を見てください。

于 2010-07-28T00:45:40.100 に答える
0

public static <T extends Comparable<T>>警告を削除します。

于 2010-07-27T20:51:44.553 に答える