Java,泛型和PECS:仍然无法理解C部分;具体的例子?

时间:2013-06-19 13:39:46

标签: java generics pecs

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

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

当我在这里时,我深深地害怕我不理解P的全部含义......我已经阅读了很多很多链接,没有明确的,明显的证据证明P是P和C是C ......

编辑关于可能已经在这里有一个答案“:不,对不起。我已经阅读了这个链接,还有很多其他人在SO上。这仍然没有告诉我这背后的核心机制到目前为止,给我的两个答案给了我一些提示,实际上比我到目前为止找到的所有链接都要多。

3 个答案:

答案 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类没有实现这样的比较器。因此代码不会编译,它会强制您创建自己的代码。