在Java,containsAll和retainAll在AbstractCollection类明确说明这一基数得不到尊重,所以换句话说,它不管如何,许多实例中的一个数值在每一侧。由于所有Java集中的标准图书馆延长AbstractCollection,假定所有这些工作的相同。

然而,文件的这些方法中收集的接口并没有说什么。是一个应该推断出从AbstractCollection,或者是这个未指定的目的,允许一定义的收藏,不同的工作?

例如,包apache-集合明确指出,它不尊重的基数,并要求它违反本合同的版本从收集(即使它并不真正).

所以,什么语义学的这些行动收集,而不是在AbstractCollection?

编辑:虽然那些人是想知道为什么我会照顾,这是因为作为一部分的我的博士学位工作我表明,开发者不要指望的一致性侵犯在阿帕奇,但是我想了解为什么收集的接口是离开这么模糊的。

有帮助吗?

解决方案

Javadocs为containsAll(在收集)说:

返回:真的,如果这个集合 包含了所有的元素 指定集合

和retainAll(在收集):

保留只有在这个元素 集合都包含在 指定的收集(《任择 操作)。换句话说,删除 从这个收集所有的 元素,不是包含在 指定的集合。

我读containsAll的合同,意味着呼吁。containsAll(b)将返回真的,如果并且只有如果,呼吁。包含(贝伦)为每个元件贝伦在b会返回正确的。我也把它意味着一个.containsAll(someEmptyCollection)还将返回正确的。作为你的状态javadocs为AbstractCollection更明确说明这一点:

这个执行迭代过 指定的收集、检查每 元件返回的迭代在 打开来看看它是包含在这 收集。如果所有元素是如此 载有真正的返回,否则, 错误的。

我同意,该接触收集containsAll应该以更加明确,以避免任何可能性对于混乱。(并阅读的javadocs为AbstractCollection应该没有必要确认的地理解收集)

我不会做一个假设方面有些重复元之后,呼吁retainAll.该说明合同在收集(由我的读取)并不意味着无论哪种方式如何重复或集会处理。根据我的读retainAll在集合多种可能的结果。retainAll(b)所有合理的:

  1. 结果包含1的每一个元素,有至少一个副本,a和b
  2. 结果包含的每一个元素(包括重复),这是一个,除了那些不在b
  3. 甚至,结果包含的某个地方1之间和数量的副本,发现在的每个元素中,除了那些不在b。我会预期要么#1或2,但将承担的任何三个要法律根据的合同。

Javadocs为AbstractCollection确认,它使用#2:

这实施访问这个 收集、检查每个元素 返回的迭代要 看看它是否包含在指定 收集。如果不是所包含的, 它是从这个集合 迭代的清除的方法

虽然因为这不在我的读书的原始收集口的合同,我不一定是假定的行为收集,一般是这样。

也许你应该考虑提出建议的更新如果是的话,为什么不试一旦你完成。

为'为什么收集的接口是离开这么模糊的'-我严重怀疑这是故意做的-也许只是些东西,不是给予其适当的优先考虑时,API的一部分的正在编写的。

其他提示

我不认为收集定义这种方式或其他的,但它只是变成了排序的一项公约,遵循AbstractCollection行为,例如 谷歌-集合 这样做:看看 他们多集的文件 (多集是什么他们叫一个袋)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top