14

次のコードを検討してください。

public abstract class Item<T> implements Comparable<T>
{
    protected T item;

    public int compareTo(T o)
    {
        return 0; // this doesn't matter for the time being
    }
}

public class MyItem<T> extends Item<String>
{
    T object;
}

public class Foo<T>
{
    protected ArrayList<T> list;
}

public class Bar<V> extends Foo<MyItem<V>>
{
    public void sort()
    {
        Collections.sort(list);
    }
}


ソート呼び出しでエラーが発生します。

境界の不一致: Collections 型のジェネリック メソッド sort(List< T >) は、引数 (ArrayList< MyItem< T > >) には適用できません。推論された型 MyItem< T > は、境界付きパラメーター < T extends Comparable< ? スーパーT > >


なぜこれが間違っているのですか?

MyItem<V>実装する場合Comparable、なぜそれが代替品ではないのですか?

これが尋ねられた場合は申し訳ありませんが、質問はやや具体的だと思います。

4

4 に答える 4

12

実際には、このエラーのより詳細な説明はあなたjavac自身を与えます:

java: に適したメソッドが見つかりませんsort(java.util.ArrayList<MyItem<V>>)

メソッドjava.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>)は適用できません (実引数リストと仮引数リストの長さが異なるため、引数からインスタンス化できません)

メソッドjava.util.Collections.<T>sort(java.util.List<T>)は適用できません (推論された型は宣言された bound(s) inferred: MyItem<V>bound(s):に準拠していませんjava.lang.Comparable<? super MyItem<V>>)

したがって、主な質問は次のとおりです。
なぜ method Collections.<T>sort(java.util.List<T>)) が適用できないのですか?

答えは次のとおりです。メソッド宣言では、パラメーターに境界がある
ためです。Collections.<T>sort(java.util.List<T>)T<T extends Comparable<? super T>>

つまり、それ自体にインターフェイスをT実装する必要があります。Comparableたとえば、Stringクラスは次のようなインターフェイスを実装します: ...implements ... Comparable<String>.

あなたの場合、Itemクラスはそのようなインターフェースを実装していません:

Item<T> implements Comparable<T>と同じものではありませんItem<T> implements Comparable<Item<T>>

したがって、この問題を解決するには、Itemクラスを次のように変更する必要があります。

public abstract class Item<T> implements Comparable<Item<T>>
{
    protected T item;

    public int compareTo(Item<T> o)
    {
        return 0; // this doesn't matter for the time being
    }
}
于 2013-07-19T07:20:59.667 に答える
1

Just change the class like follow:

     public class MyItem<T> extends Item<String> implement Comparable<MyItem<T>>
     {
         T object;
     }

Or

       public abstract class Item<T> implements Comparable<MyItem<T>>
       {
           protected T item;

           public int compareTo(MyItem<T> o)
           {
              return 0; // this doesn't matter for the time being
       }

}

The error tips has shown us.Hope it helpful.

于 2013-07-19T07:30:50.393 に答える