吞吐量原理说明


82

我读了O'Reilly的书,因为我了解了这一计算原理

  • extends当您仅从结构中获取值时,请使用通配符。
  • super值放入结构时,请使用通配符。
  • 当您都想从结构中放入和放置结构时,请不要使用通配符。

例外情况是:

  • extends除了值null(属于每个引用类型)之外,您不能将任何其他内容放入用通配符声明的类型中。

  • 您不能从使用super通配符声明的类型中获取任何东西,除了type的值(Object这是每个引用类型的超类型)之外。

谁能帮助我深入探索这个规则?如果可能的话,请把它们分层。


4
+1:总是很高兴看到有人要求澄清基本面
所有人都是2009年

2
@所有人,我认为您是指基本意义上的基础而非背侧?
Rich Seller

Answers:


164

考虑一堆香蕉。这是Collection<? extends Fruit>因为它是一种特定种类的水果的集合-但是您(从该声明中)不知道它是哪种水果的集合。您可以从中得到一个项目,并且知道它肯定是水果,但是您不能添加它-您可能正在尝试将苹果添加到一堆香蕉中,这肯定是错误的。您可以添加null它,因为这对于任何种类的水果都是有效值。

现在考虑一个水果碗。这是一个Collection<? super Banana>,因为它是某种类型“大于”的集合Banana(例如Collection<Fruit>Collection<TropicalFruit>)。您绝对可以在其中添加一个香蕉,但是如果您从碗中取出一个物品,您将不知道会得到什么-它很可能不是香蕉。您唯一可以确定的是,它将是有效的(可能是nullObject参考。

(通常,对于Java泛型问题,Java泛型FAQ是一个很好的资源,其中包含您可能会提出的几乎所有与泛型相关的答案。)


但是在从Collection <?extendeds Fruits>获取水果时,您可能会得到任何水果,而不是香蕉。同样,在放入水果的同时,您可以添加可能不属于香蕉水果的任何东西
JavaResp

6
Collection<? extends Fruit>正是由于这个原因,Java会阻止您向null添加除null以外的任何内容,并且正是出于这些原因,您必须显式转换获取项目的结果。
乔恩·斯基特

@JonSkeet这可能是一个愚蠢的问题,但是在什么情况下不对add()和get()方法都具有“访问权限”有用吗?我的意思是,要从列表中获取某些对象,您必须先添加它,对吗?反之亦然,如果以后无法获得它,为什么还要添加它呢?
Timmos

7
@Timmos:仅仅因为某些东西必须能够添加一个值,并不意味着所有代码都必须能够。例如,为了显示一个人的名字列表,我可能只需要一个Collection<? extends Person>(或者更可能是一个Iterable<? extends Person>,但是...)。创建该集合的代码很可能需要将其设置为Collection<Employee>,而使用代码则不需要。
乔恩·斯基特

5
@Timmos:在这种情况下,您必须确切地说出“它”的含义……但是,是的,Java泛型规则旨在提供类型安全性。
乔恩·斯基特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.