0

我将在这里发布一个链接:Collections.sort(). 关于 PECS 范式的 SO 上有很多帖子,包括这个。在我自己的个人代码中,我经常使用泛型,但只使用过 P 部分(即<X extends SomethingElse>)。

Collections.sort期望作为其泛型参数 a <T extends Comparable<? super T>>。我看不到那里的super踢脚线。你有一个具体的例子说明为什么这是必要的吗?

当我这样做时,我很担心我也不理解 P 的全部含义......我已经阅读了很多很多链接,但没有清楚、明显的证据证明 P 是 P 并且 C 是 C。 ..

编辑至于这里可能已经有答案“:不,抱歉。我已经阅读了这个链接,以及其他许多关于 SO 的链接。这仍然没有告诉我这一切背后的核心机制。到目前为止给我的两个答案给出了我的提示,实际上比到目前为止我能找到的所有链接都多。

4

3 回答 3

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

所以这里的“super”允许重用 MyNumberComparator 来排序整数和排序 Long。

于 2013-06-19T13:51:49.057 回答
2

我看不到超级在哪里踢。你有一个具体的例子说明为什么这是必要的吗?

假设你有一个 class ,它可以与所有sAnimal相媲美:Animal

public class Animal implements Comparable<Animal>

现在假设你有一个类Dog,它扩展了Animal

public class Dog extends Animal

现在的问题是,可以Dog与另一个比较Dog吗?(即你能做到吗myDog.compareTo(yourDog))答案当然是。A Dog,作为Animal,可与所有 s 相媲美Animal,包括Dogs(以及Cats)。

但是,Dog没有实现Comparable<Dog>,因此绑定T extends Comparable<T>不适用于T = Dog

但是对于排序,我们关心的是类型可以与自身进行比较(Dog可以这样做)。因此,最合适的限制最少的界限是T extends Comparable<? super T>,它确实适用于Dog

于 2013-06-20T21:41:28.740 回答
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 类没有实现这样的比较器。因此代码不会编译,它会迫使您创建自己的代码。

于 2013-06-19T13:53:14.390 回答