2

より一般的にリストの最大値を見つけようとしています。ワイルドカードを適用しました。

public class Main{
    public static void main(String[] args){ }
    public static <T extends Comparable<? extends T>> T max(Collection<? extends T> c){
        T max= c.iterator().next();
        for(T element : c){
            if(element.compareTo(max)>0) max=element;//Compile error
        }
        return max; 
    }
}

コンパイラから次のエラー メッセージが表示されました。

incompatible types: T cannot be converted to CAP#1
where T is a type-variable:
T extends Compareble<? extends T> declared in method <T>max(Collection<? extends T>)
where CAP#1 is a fresh type-variable:
CAP#1 extends T from capture ? extends T

このエラーメッセージについて疑問があります

新鮮な型変数とはどういう意味ですか? JLS 4.1 で書かれているように、Java プログラミング言語には 2 種類の型があります。プリミティブ型と参照型です。また、式の型である名前のない特別な null 型もあり nullます

CAP#1 の新しい型変数とは何ですか?

4

2 に答える 2

2

使用する

public class Main{
    public static void main(String[] args){ }
    public static <T extends Comparable<? super T>> T max(Collection<? extends T> c){
        T max= c.iterator().next();
        for(T element : c){
            if(element.compareTo(max)>0) max=element;
        }
        return max; 
    }
}

編集:

問題は、T が T または T の任意のスーパークラスと比較できる必要があることです。

T、またはTのサブクラスのいずれかであるクラスに匹敵するものとしてTを持っていましたが、これは十分ではありませんでした。

または、別の見方をすると、 Comparator内の は Collection 内の? extends Tと同じクラスではない可能性があります。? extends T

これがこれらのエラーの原因でした。

参考までに、のワイルドカードの恩恵を受けるかどうかはわかりませんCollection<? extends T>Collection<T>うまくいきます。

于 2013-10-27T17:42:33.027 に答える
1

GuavaOrderingからも使用できます:

Ordering.from(comparator).max(collection);
于 2013-10-27T19:10:24.150 に答える