关于PECS java泛型

Bil*_*ory 1 java generics

阅读Java Essentials,第2版,有一个名为PECS的规则,用于方法参数中的类型安全.如果它产生你的延伸,消耗你使用超级.对不起,如果我定义错了,因为我没有得到它.

任何人都可以阐明Joshua Bloch所指的生产者/消费者吗?

pet*_*ust 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
Run Code Online (Sandbox Code Playgroud)