为什么返回类型在ArrayList添加方法中有所不同?

时间:2014-05-22 11:46:32

标签: java oracle arraylist

为什么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方法。

感谢您阅读我的问题。

2 个答案:

答案 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都是多余的。