1

チュートリアルで、次の署名を使用した例を作成しました (インターフェイスの一部として)。

<T> List<Comparable<T>> sort(Collection<Comparable<T>> c, boolean ascending);

警告なしでそのメソッドを実装することはほぼ不可能であることがわかりました。

public <T> List<Comparable<T>> sort(Collection<Comparable<T>> c, boolean ascending) {
    List<T> list = new ArrayList<T>();
    Collections.sort(list);
    return list;
}

表示される行のエラーCollections.sort(list)は次のとおりです。

Bound mismatch: The generic method sort(List<T>) of type Collections is not 
applicable for the arguments (List<T>). The inferred type T is not a valid 
substitute for the bounded parameter <T extends Comparable<? super T>>

ただし、次の署名では機能します。

<T extends Comparable<T>> List<T> sort(Collection<T> c, boolean ascending);

その署名により、上記のコード (の実装sort) は期待どおりに機能します。その理由は何なのか知りたいです。

4

2 に答える 2

3

s のリストは、Comparable<T>s と比較可能なオブジェクトのリストですTTこれらのオブジェクト自体がsであるかどうかはわかりません。したがって、2 つの要素を互いに比較することはできません。

Tたまたま他Tの s と比較可能な s は、互いに比較することができます。そのため、そのような のリストをソートするTことが可能です。

于 2012-10-17T10:05:34.707 に答える
2

Collections.sortつまりList<T extends Comparable<? super T>>、コンパイラは、並べ替え対象のリストの要素の型がTComparable<E>のスーパークラス、または によって実装されたインターフェースを拡張していることを伝えることができる必要があります。での最初の署名ではこれが強制されないため、. あなたは言うことでそれを機能させることができますETTTpublic <T> List<Comparable<T>> sortCollections.sortList<T>

List<Comparable<T>> list = new ArrayList<Comparable<T>>();

sort メソッドが返す型と一致するようにしますが、これの問題は、かなり柔軟性がないことです. whereCollection<Comparable<Foo>>ではなくaしかソートできません. 最も柔軟なアプローチは、に固執することですが、次のような署名を使用しますCollection<Bar>Bar implements Comparable<Foo>new ArrayList<T>()

<T extends Comparable<? super T>> List<T> sort(Collection<T> c, boolean ascending);

Tこれは、並べ替えを有効にするための最小限の制限を設定しBar extends Foo implements Comparable<Foo>ます。これは、2 番目の署名では許可されていない で機能します (これには が必要ですBar implements Comparable<Bar>)。

于 2012-10-17T10:20:40.587 に答える