【发布时间】:2010-12-26 23:55:05
【问题描述】:
阅读 Java Essentials,第 2 版,有一条称为 PECS 的规则用于方法参数中的类型安全。如果它产生你扩展,消耗你使用超级。对不起,如果我定义错了,因为我不明白。
谁能解释一下 Joshua Bloch 所说的生产者/消费者是什么?
【问题讨论】:
阅读 Java Essentials,第 2 版,有一条称为 PECS 的规则用于方法参数中的类型安全。如果它产生你扩展,消耗你使用超级。对不起,如果我定义错了,因为我不明白。
谁能解释一下 Joshua Bloch 所说的生产者/消费者是什么?
【问题讨论】:
查看此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
【讨论】:
getClass() 的方法(实际上它不仅仅是在其声明中具有通配符返回类型,Class<?> [相当于Class<? extends Object>];它返回一个Class<? extends [whatever class getClass() was called in]>)。 ...不过,我想这并不适用于将泛型与集合一起使用。
当一个方法读取/迭代集合中的元素时,它是消费者,当它向集合做广告时,它是生产者。
【讨论】: