fre*_*low 3 java generics covariance contravariance bounded-wildcard
以下三个签名之间有什么区别?
static <T> void foo(List<T>, Comparator<? super T>);
static <T> void bar(List<? extends T>, Comparator<T> );
static <T> void baz(List<? extends T>, Comparator<? super T>);
Run Code Online (Sandbox Code Playgroud)
我知道泛型中的含义extends和super含义.我的问题是foo,bar和之间是否存在差异baz.我是否应该使其中一个参数保持不变,另一个变量在适当的方向上,或者我应该使它们两个变体?这有什么不同吗?
PECS - 生产者扩展,消费者超级.
解释这个"规则":
extends表示泛化对象生成该类型的元素.当它是一个集合时,它意味着你只能从集合中获取元素,但不能将它们放入.比较器super表示对象使用所选类型的对象.所以你可以添加到集合中,但不能从中读取.关于Comparator,我不认为它有任何区别.通常,这是<? super T>因为比较器消耗了对象,但在所有三种情况下都可以安全地调用Collections.sort(list, comparator);(其签名是<? super T>)