为什么ArrayList.add(E e)和ArrayList.add(int index, E element)的回复类型不同?
有人能帮我解释一下吗?因为今天我收到了如下错误..
public void Foo(List<String> list) {
// do something
}
..........
从我的测试类中调用此方法为Foo(new ArrayList<String>().add("John"));
我的IDE中出现了编译错误。所以,我注意到ArrayList.add(E e)方法不是void
返回类型。如果是这样,我不知道为什么这个方法返回布尔类型。
PS:我认为ArrayList.add(E e)方法在很长一段时间内都有void方法。
感谢您阅读我的问题。
答案 0 :(得分:5)
您的链接有答案。多加注意!
Returns true (as specified by Collection.add(E))
来自Collection.add(E):
Returns true if this collection changed as a result of the call
另外(感谢Mark Rotteveel):
&#34;如果一个集合因为已经包含该元素的原因而拒绝添加特定元素,那么它必须抛出一个异常(而不是返回false)。这保留了在此调用返回后集合始终包含指定元素的不变量。&#34;
因此,如果它返回true
,则添加元素,如果它返回false
元素已经存在(例如在Set
中),并且在其他情况下需要异常被抛出(例如,如果Collection
会限制其大小而不是阻止)。
差异的原因是add(E)
的合同在Collection
中定义,而add(int index, E e)
在List
界面中定义(并且不是true
。我需要返回任何东西)。它也可以返回Collection
,但它将毫无用处。另一种方法有返回true,否则会破坏{{1}}的合约。
答案 1 :(得分:4)
Collections.add(element)可以由不添加元素的Collection实现。 e.g
Collection<String> col1 = new HashSet<String>();
col1.add("hi"); // return true
col1.add("hi"); // return false
由于ArrayList还从Collection继承了add(element),因此它必须遵循相同的接口。
List.add(int,element)不是从Collection继承的,因为只有List是可索引的。将它作为Collection方法是没有意义的。这意味着它只能由总是添加元素的集合实现(或抛出异常)因此每次返回true
都是多余的。