3

これがケースです。2つのクラス、、、AおよびB汎用インターフェイスがありますC

Class A implements Comparable<A> {...}

interface C<T> {...}

//this class is not longer generic type, I do not know if this matter.
Class B extends A implements C<A> {...} 

それから、他のクラスで、Bリストを取得して、次のように並べ替えました

List<B> list = new ArrayList<B>();
Collections.sort(list);

これは完全に機能しますが、より一般的なものになるように、のリストをB汎用インターフェイスに変更したいと思いますC

List<C<A>> list = new ArrayList<C<A>>();
Collections.sort(list);

今回は次のようなエラーが発生しました。

バインドの不一致:sort(List<T>)タイプの一般的なメソッドはCollections、引数には適用できません(List<C<A>>)。推論された型C<A>は、制限されたパラメーターの有効な代替ではありません<T extends Comparable<? super T>>

私は次の変更を試しました(もちろん機能しません):

  1. Cに変更interface C<T> extends Comparable<T>{...}
  2. Bに変更class B extends A implements C<A>, Comparable<T> {...}

誰か助けてもらえますか?

4

3 に答える 3

2

CをインターフェイスCに変更します。Comparable{...}を拡張します。クラスBはAを拡張します。Cを実装します{...}

エラーメッセージからすでにわかるように、との定義に競合が発生するため、これら2つは連携しませBん。Comparable<A>Comparable<C<A>>

Aはすでに実装されているのでComparable<A>、次のことができます

List<C<A>> list = new ArrayList<C<A>>();
Collections.sort(list);

Comparator次のようにforを定義C<A>します。

class CTComparator<T> implements Comparator<C<T>>
{
    @Override
    public int compare(C<T> o1, C<T> o2)
    {
        return 0;
    }
}

次に、このコンパレータでソート方法を適用します。

List<C<T>> list  = new ArrayList<C<T>>();
Collections.sort(list, comparator);
于 2012-11-12T05:27:13.133 に答える
1

で定義されC<A>た可視性を持っていないので、それ故に不平を言っています。の新しいコンパレータをブローとして定義します。それで問題ないはずです。ComparatorAC<A>

List<C<A>> list = new ArrayList<C<A>>();
Collections.sort(list, new Comparator<C<A>>() {
    @Override
    public int compare(C<A> o1, C<A> o2) {
        //implement the comarison
        return 0;
    }
});
于 2012-11-12T06:48:44.157 に答える
1

C<T>含まれている型に基づいて一般的に比較可能であると予想される場合は、それ自体で比較可能にする必要があります( C<T>、ではなくT)が、その値型をを実装するものにバインドしますComparable。このようなもの:

public class C<T extends Comparable<? super T>> extends Comparable<C<T>> {
    private final T value;

    @Override
    public int compareTo(C<T> that) {
       return this.value.compareTo(that.value);
    }
}

これは、単に値をラップするコンテナなど、一部のコンテナでのみ意味があります。

于 2012-11-12T07:02:32.153 に答える