2013-07-19 15 views
12

がコードを考えてみましょう匹敵するジェネリック型の代用として有効ではありませんか?推測されるタイプは

MyItem<V>Comparableを実装する場合、それはなぜ代替ではありませんか?

ご迷惑をおかけして申し訳ありませんが、私は質問が多少具体的だと感じています。

答えて

11

実は、このエラーのより詳細な説明は、あなたのjavac自体を与える:

java: no suitable method found for sort(java.util.ArrayList<MyItem<V>>)

method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable (cannot instantiate from arguments because actual and formal argument lists differ in length)

method java.util.Collections.<T>sort(java.util.List<T>) is not applicable (inferred type does not conform to declared bound(s) inferred: MyItem<V> bound(s): java.lang.Comparable<? super MyItem<V>>)

ので、主な質問は次のとおりです。
なぜ法Collections.<T>sort(java.util.List<T>))該当しないのですか?

答えはです:<T extends Comparable<? super T>>
は のでCollections.<T>sort(java.util.List<T>)メソッド宣言では、パラメータT上の限界があります。

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

は、このようなインタフェースを実装していません。

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

ので、この問題を解決するために、あなたはこの1つにあなたの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 
    } 
} 
+1

はあなたにItem<T>クラスを変更し

。乾杯!私が提供したコードは私の実際のコードのはるかに単純化されたバージョンなので、明確にするために、私は余分なクラスを含めました。私は実際の比較自体を変えることができないということを完全に忘れてしまった。再度、感謝します。 – terrorcell

+0

Better: 'public abstract class Item はComparable <?を実装しています。商品番号> 'いいえ? –

0

あなただけの効果を確認するために汎用化クラスMyItemを持っている必要はありません。次のクラスは何が起こるか見て十分です:

public class MyItem extends Item<String> {} 

今、あなたは次の呼び出しがあります。モルガーノソート方法は、タイプTでパラメータ化されたコレクションがかかりますが、正確に述べたように

Collections.sort(list); 

をあなたのMyItemクラスはItem<String>に拡張され、MyItemStringsに匹敵します。

public abstract class Item<T> { 
    protected T item; 
} 

public class MyItem extends Item<String> implements Comparable<MyItem> { 
    @Override 
    public int compareTo(MyItem o) { 
     return item.compareTo(o.item); // just an example 
    } 
} 

そして今Collections.sort(list)への呼び出しが動作します:クラスはComparableインターフェイスを実装している小さなスイッチ付

は、あなたが期待される結果を取得します。

1

ただ、フォローのようなクラスに変更します。エラーのヒント

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

それとも

 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 
     } 

}

は、それが参考にus.Hopeを示しています。

2

タイプXのオブジェクトが互いに匹敵するものである場合、クラスXは正確にComparable<X>を実装する必要があります。

これはあなたのコードが行っていることではなく、クラスItem<T>があり、Comparable<Item<T>>の代わりにComparable<T>を実装しています。つまり、Item<T>Tと比較できますが、必要なのはItem<T>ではありません。上のスポットでした

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

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

"タイプXのオブジェクトが互いに比較可能であるためには、クラスXはまったく同等のものを実装しなければなりません"必ずしも正確ではない。 Xは 'Comparable ' – newacct

+0

@newacctを実装できます – Dukeling

関連する問題