2

有人可以用通配符向我解释 Java 泛型中扩展和超级之间的区别吗?

我已阅读相关帖子并没有完全理解。如果你能用实时的例子来解释我,那对我会有很大的帮助。

PECS(生产者你扩展,消费你使用超级)是什么意思?

4

2 回答 2

3

如果您有 A、B 和 C 类,其中

A 扩展 B

B 扩展 C

然后

A和B匹配:

? 扩展 B

B和C匹配:

? 超级乙

于 2012-06-22T13:11:05.563 回答
1

类型参数 <? extends T> 表示 T 或 T 的任何子类。

类型参数 <? super T> 表示 T 或 T 的任何超类。

例如:

  • 可迭代<? extends T> 支持任何 next() 方法返回 T 的迭代器。这包括返回 T 的子类的迭代器。
  • 收藏<? super T> 支持任何可以放置 T 的集合。这包括可以保存 T 的任何超类的对象的集合。

Effective Java中,Joshua Bloch 推荐了助记符PECS——代表“Producer-Extends, Consumer-Super”。

“如果参数化类型代表 T 生产者,则使用<? extends T>;如果它代表 T 消费者,则使用<? super T>。”

这也称为Get 和 Put 原则,来自Maurice Naftalin 和 Philip Wadler 的Java Generics

extends当你只从结构中获取值时使用super通配符,当你只将值放入结构时使用通配符,当你同时获取和放置时不要使用通配符。”

于 2012-06-22T13:27:56.080 回答