0

ここに 1 つのリンクを掲載しますCollections.sort()。これを含め、PECS パラダイムに関して SO に関する多くの投稿がありまし。私自身の個人的なコードでは、ジェネリックをかなり多く使用していますが、P 部分 (つまり<X extends SomethingElse>) しか使用したことがありません。

Collections.sortジェネリック引数として a を期待します<T extends Comparable<? super T>>super私はそこにキックがどこにあるのかわかりません。これが必要な理由の具体例はありますか?

私がそれに取り組んでいる間、私は P の完全な含意も理解していないことを深く恐れています...私は、P が P であり、C が C であるという明確で明白な証拠を持っていないまま、非常に多くのリンクを読みました。 ..

EDITに関しては、すでにここに回答があるかもしれません」:いいえ、申し訳ありません。私はこのリンクとSOに関する他の多くのリンクを読みました。これはまだ、すべての背後にあるコアメカニズムを教えてくれません。実際、これまでに見つけたすべてのリンクよりも多くのヒントがあります。

4

3 に答える 3

2

スーパーがそこに入る場所がわかりません。これが必要な理由の具体例はありますか?

すべての sAnimalに相当するclassがあるとします。Animal

public class Animal implements Comparable<Animal>

Dogを拡張する class があるとしましょうAnimal:

public class Dog extends Animal

ここで問題は、Dog別のものと比較できるDogかということです。(つまり、できますかmyDog.compareTo(yourDog)) 答えはもちろんです。ADogは、 として、を含むAnimalすべての に匹敵します(および も)。AnimalDogCat

ただし、Dogは を実装していないComparable<Dog>ため、境界T extends Comparable<T>はには機能しませんT = Dog

しかし、ソートに関して私たちが気にするのは、その型がそれ自体と比較できる (Dogできる) ことだけです。したがって、適切な最小制限境界はT extends Comparable<? super T>であり、 に対して機能しDogます。

于 2013-06-20T21:41:28.740 に答える
2

例えば

List<Interger> myIntegers = Arrays.asList(5, 2, 3);

List<Long> myLongs = Arrays.asList(5L, 2L, 3L);

MyNumberComparator myNumberComparator = new Comparator<Number>(){...}

Collections.sort(myIntegers, myNumberComparator ); // Number is "super" class of Integer
Collections.sort(myLongs , myNumberComparator ); // Number is "super" class of Long

したがって、ここで「スーパー」を使用すると、整数の並べ替えと長整数の並べ替えの両方に MyNumberComparator を再利用できます。

于 2013-06-19T13:51:49.057 に答える