我将在这里发布一个链接:Collections.sort()。已经有很多关于PECS范式的文章,包括this one。在我自己的个人代码中,我使用了相当多的泛型,但只使用过P部件(即<X extends SomethingElse>)。
Collections.sort期望它的泛型参数是<T extends Comparable<? super T>>。我看不出super是怎么进去的。你有一个具体的例子说明为什么这是必要的吗?
当我在做这件事的时候,我很担心我也不理解P的全部含义。我读过很多很多的链接,没有明确的证据证明P是P,C是C.
编辑“关于五月”的文章已经有了一个答案:“不,对不起。我读过这个链接,还有很多其他的链接。这仍然没有告诉我这一切背后的核心机制。到目前为止,给我的两个答案给了我暗示,实际上比我目前所能找到的所有链接都多。”
发布于 2013-06-19 13:51:49
例如。
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用于排序整数和排序Longs。
发布于 2013-06-20 21:41:28
我看不出超级英雄在哪里。你有一个具体的例子说明为什么这是必要的吗?
假设您有一个类Animal,它可以与所有Animal的:
public class Animal implements Comparable<Animal>现在假设您有一个类Dog,它扩展了Animal
public class Dog extends Animal现在的问题是,Dog能与另一个Dog相比吗?(即你能做myDog.compareTo(yourDog))答案当然是。Dog作为Animal,可与所有Animals相媲美,包括Dogs (以及Cats)。
但是,Dog不实现Comparable<Dog>,因此绑定T extends Comparable<T>不适用于T = Dog。
但是对于排序,我们关心的是类型可以与自身进行比较( Dog可以这样做)。因此,合适的最小限制界是T extends Comparable<? super T>,它确实适用于Dog。
发布于 2013-06-19 13:53:14
尝试创建一个数字列表:
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类没有实现这样的比较器。因此,代码不编译,它迫使您创建自己的代码。
https://stackoverflow.com/questions/17192772
复制相似问题