がコードを考えてみましょう匹敵するジェネリック型の代用として有効ではありませんか?推測されるタイプは
MyItem<V>
がComparable
を実装する場合、それはなぜ代替ではありませんか?
ご迷惑をおかけして申し訳ありませんが、私は質問が多少具体的だと感じています。
がコードを考えてみましょう匹敵するジェネリック型の代用として有効ではありませんか?推測されるタイプは
MyItem<V>
がComparable
を実装する場合、それはなぜ代替ではありませんか?
ご迷惑をおかけして申し訳ありませんが、私は質問が多少具体的だと感じています。
実は、このエラーのより詳細な説明は、あなたの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
}
}
あなただけの効果を確認するために汎用化クラスMyItem
を持っている必要はありません。次のクラスは何が起こるか見て十分です:
public class MyItem extends Item<String> {}
今、あなたは次の呼び出しがあります。モルガーノソート方法は、タイプTでパラメータ化されたコレクションがかかりますが、正確に述べたように
Collections.sort(list);
をあなたのMyItem
クラスはItem<String>
に拡張され、MyItem
はString
sに匹敵します。
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
インターフェイスを実装している小さなスイッチ付
ただ、フォローのようなクラスに変更します。エラーのヒント
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を示しています。
タイプ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
}
}
:
はあなたにItem<T>
クラスを変更し。乾杯!私が提供したコードは私の実際のコードのはるかに単純化されたバージョンなので、明確にするために、私は余分なクラスを含めました。私は実際の比較自体を変えることができないということを完全に忘れてしまった。再度、感謝します。 – terrorcell
Better: 'public abstract class ItemはComparable <?を実装しています。商品番号> 'いいえ? –