PECS For generics in Non Collections
Joshua Bloch来与自己的规则,它说,当使用?T和扩展?超级T.如果你想自己的条件集合框架,那么它是非常简单的。如果你添加值到数据结构,使用?超级T.如果你读取数据结构,使用?扩展。例如:
1 2 3 4 5 6 | public class Collections { public static <T> void copy(List<? super T> dest, List<? extends T> src) { for (int i = 0; i < src.size(); i++) dest.set(i, src.get(i)); } } |
如果我检查签名)
1 | public static <T> void sort(List<T> list, Comparator<? super T> c) |
i湖比较器的使用?A超,所以应该消费。寻找在C代码,比较器是用来产生的东西,因为它是在比较的逻辑。
在一个手,我知道它为什么是一个超级因为我想作为一个开发人员使用comparators类的超类,所以comparators T和T(T,因为对象是超班的类型。但当我试图想在自己的术语,我不明白。
只做自己的收藏扑克的框架?如果有人可以解释我需要什么,以及如何在collections.sort比较器?
为了回答这个问题,我们以
如果仔细考虑,您会发现
更一般地说,您应该从主类型的角度来考虑生产者和消费者,考虑到每个通用参数的类型。如果某些
作为一个具体的例子,如果您碰巧已经有了逻辑来比较两个通用的
考虑下面的比较器:
1 |
这里,比较程序
如果您有以下
1 |
以及以下方法:
1 2 3 | static <T> void sort(List<T> list, Comparator<T> c) { list.sort(c); } |
(注意,
然后,如果您要对
由于该比较器的类型为
1 | sort(doubles, c); |
幸运的是,由于
1 2 3 | static <T> void sort(List<T> list, Comparator<? super T> c) { list.sort(c); } |
现在,这段代码将编译:
1 | sort(doubles, c); |