我会在这里发布一个链接:Collections.sort()
。关于PECS范例,有很多关于SO的帖子,包括this one。在我自己的个人代码中,我使用了泛型,但只使用了P部分(即<X extends SomethingElse>
)。
Collections.sort
期望其泛型参数为<T extends Comparable<? super T>>
。我没有看到super
在那里踢的位置。你有一个具体的例子说明为什么这是必要的吗?
当我在这里时,我深深地害怕我不理解P的全部含义......我已经阅读了很多很多链接,没有明确的,明显的证据证明P是P和C是C ......
编辑关于可能已经在这里有一个答案“:不,对不起。我已经阅读了这个链接,还有很多其他人在SO上。这仍然没有告诉我这背后的核心机制到目前为止,给我的两个答案给了我一些提示,实际上比我到目前为止找到的所有链接都要多。
答案 0 :(得分:2)
E.g。
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
因此,“super”允许重用MyNumberComparator来排序整数和排序Longs。
答案 1 :(得分:2)
我没有看到那里超级踢的地方。你有没有 为什么这是必要的具体例子?
假设您有一个类Animal
,它与所有Animal
s相当:
public class Animal implements Comparable<Animal>
现在让我们说你有一个Dog
课,它延伸Animal
:
public class Dog extends Animal
现在的问题是,Dog
可以与另一个Dog
进行比较吗? (即你能做myDog.compareTo(yourDog)
)答案当然是。作为Dog
的{{1}}可与所有Animal
相媲美,包括Animal
s(以及Dog
s)。
但是,Cat
未实现Dog
,因此绑定的Comparable<Dog>
不适用于T extends Comparable<T>
。
但是对于排序我们关心的是类型可以与自身进行比较(T = Dog
可以做到)。因此,合适的最小限制范围是Dog
,它适用于T extends Comparable<? super T>
。
答案 2 :(得分:1)
尝试创建一个数字列表:
List<Number> list = new ArrayList<Number>(Arrays.asList(2, 3.14, 5, 0, 42, 2.5));
现在尝试对其进行排序:
Collections.sort(list);
查看泛型参数<T extends Comparable<? super T>>
,在本例中它等同于<Number extends Comparable<? super Number>>
。但是Number类没有实现这样的比较器。因此代码不会编译,它会强制您创建自己的代码。