2014-05-22 35 views
0

爲什麼退貨類型在ArrayList.add(E e)ArrayList.add(int index, E element)中有所不同?
有人能解釋我有點嗎?因爲今天的我爲低於錯誤..爲什麼返回類型在ArrayList添加方法中有所不同?

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方法。

感謝您閱讀我的問題。

回答

5

您的鏈接有答案。更加註意!

Returns true (as specified by Collection.add(E))

從Collection.add(E):

Returns true if this collection changed as a result of the call

而且(感謝馬克Rotteveel):

「如果一個集合拒絕添加特定的元素以任何理由除了它已經包含了元素之外,它必須拋出一個異常(而不是返回false),這就保留了一個集合在這個cal之後總是包含指定元素的不變量我回來了。「

所以,如果它返回true,加入的元素,如果返回false元素已經在那兒了(如在Set),並在其他情況下的異常需要被拋出(例如,如果一個Collection會限制其大小,而不是阻止)。

而對於差異的原因是,add(E)合同中Collection定義,而add(int index, E e)List接口定義(並不需要返回任何東西)。它也可以返回true,但它沒用。另一種方法已將返回true,因爲否則它將打破Collection的合同。

+2

您可能還想包括引號:_「如果集合因爲除了它已經包含元素之外的任何原因而拒絕添加特定元素,它必須拋出異常(而不是返回false)。在此調用返回後,集合始終包含指定元素。「_ from http://docs.oracle.com/javase/7/docs/api/java/util/Collection.html#add(E) –

+0

I don看不出這是如何回答這個問題的。他問爲什麼一個重載返回'void'和另一個'boolean'。 –

+0

@JeroenVannevel一個方法在'Collection'中定義,另一個在'List'中定義。 – Kayaman

3

Collections.add(element)可以由不添加元素的Collection實現。例如

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是可索引的。它是一個收集方法是沒有意義的。這意味着它只能通過總是添加元素的集合來實現(或拋出一個Exception)。因此,每次返回true都是多餘的。

相關問題