阅读Java Essentials,第2版,在方法参数中有一个名为PECS的规则用于类型安全。如果它产生你的延伸,消耗你使用超级。对不起,如果我把它定义错了,因为我没有得到它。
任何人都可以了解Joshua Bloch所指的生产者/消费者吗?
答案 0 :(得分:8)
请参阅此pdf,其上有一系列幻灯片(搜索PECS):
通用类型不变
•也就是说,List<String>
不是List<Object>
的子类型
•适合编译时类型安全,但不灵活
有界通配符类型提供额外的API灵活性
•List<String>
是List<? extends Object>
的子类型
•List<Object>
是List<? super String>
所以
PECS - 制片人延伸,消费者超级
•对Foo<? extends T>
制片人使用T
•对Foo<? super T>
消费者
T
仅适用于输入参数(不要将通配符类型用作返回类型)。
假设您要将批量方法添加到Stack:
void pushAll(Collection<? extends E> src);
//src is an E producer
void popAll(Collection<? super E> dst);
// dst is an E consumer
答案 1 :(得分:3)
当一个方法读取/迭代一个集合中的元素时,它就是一个消费者,当它向一个集合广告时,它就是一个生产者。