带有通配符的java泛型

时间:2012-06-22 13:03:53

标签: java generics effective-java

有人可以向我解释带有通配符的java泛型中的extends和super之间的区别吗?

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

PECS(你扩展的制作人,消费你使用超级)是什么意思?

2 个答案:

答案 0 :(得分:3)

如果您有A,B和C类

A延伸B

B延伸C

然后

A和B匹配:

?延伸B

B和C匹配:

?超级B

答案 1 :(得分:1)

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

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

例如:

  • 可迭代&LT ;?延伸T>支持其next()方法返回T的任何迭代器。这包括返回T的子类的迭代器。
  • 收集和LT ;?超级T>支持任何可以放置T的集合。这包括可以保存任何超类T的对象的集合。

Effective Java 中,Joshua Bloch建议使用助记符 PECS - “Producer-Extends,Consumer-Super”。

  

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

这也被Maurice Naftalin和Philip Wadler所知,来自 Java Generics 获取和放置原则

  

“只有从结构中获取值时使用extends通配符,当您只值放入时,请使用super通配符一个结构,当两者获取和放置时,不要使用通配符。“