在Java中,AbstractCollection类中的containsAll和retainAll明确指出基数不受尊重,换句话说,每一边有多少个值实例并不重要。由于标准库中的所有Java集合都扩展了AbstractCollection,因此假定它们都工作相同。在Collection接口地址基数中是否包含All()和retainAll()?
但是,Collection接口中这些方法的文档没有说明什么。是否应该从AbstractCollection中推断出来,还是为了让用户定义具有不同工作效果的集合而没有明确说明?
例如,apache集合中的Bag明确声明它确实尊重基数,并声称它违反了集合版本的合约(即使它不是真的)。
那么,这些操作在Collection中的语义是什么,而不是AbstractCollection中的?
编辑:那些想知道为什么我会在意的人,这是因为我的博士学位的一部分。工作我证明开发人员不希望Apache中的一致性违规,但我想了解为什么Collection接口留下如此含糊不清。
问题是该约定可能会导致界面的误解。例如,Apache中的Bag文档说这是在Collection中声明的,尽管它在AbstractCollection中声明。从执行的典型行为中推断界面合同通常不是一个好主意...... – Uri 2009-05-03 05:41:36
我完全同意你的看法。这是事实上的,而不是法律上的合同。所以我认为以不同的方式实现一个集合是可以的,但是强调了Javadoc的不同之处,就像Apache Collections一样。 – Yardena 2009-05-03 07:18:33