我注意到了Collections.sort的具体说明:
public staticvoid sort(List list, Comparator super T> c)
为什么? super
这里需要" "?如果ClassB
延伸ClassA
,那么我们不能保证无论如何Comparator
能够比较两个ClassB
物体,没有" ? super
"部分吗?
换句话说,给定此代码:
Listlist = . . . ; Comparator comp = . . . ; Collections.sort(list, comp);
为什么编译器不够聪明,即使没有? super
为Collections.sort()的声明指定" " 也不行!
Josh Bloch今年在Google I/O上发表了一篇名为Effective Java Reloaded的演讲,您可能会感兴趣.它讨论了一个名为"Pecs"(生产者extends
,消费者super
)的助记符,它解释了为什么在输入参数中使用? extends T
和? super T
(仅用于返回类型),以及何时使用哪些.
在使用通配符更有趣的情况下,有一个非常好(但有点曲折)的解释.