在Java中,在API中使用接口類型而不是具體類是一種很好的做法。
你的問題是你正在使用ArrayList
(可能在很多地方),你真的應該使用List
。因此,您爲自己製造了一些問題,並列出了一個不必要的限制,即該列表爲ArrayList
。
這是你的代碼應該是什麼樣子:
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
你提出的「解決方案」的問題是/是這樣的:
new ArrayList(input.subList(0, input.size()/2))
通過使副本工作子列表。這不是正常意義上的切片。此外,如果子列表很大,則複製將會很昂貴。
如果您是通過API的,你不能改變,這樣你必須聲明inputA
作爲ArrayList
,你可能能夠實現的ArrayList
自定義子類的限制,其中subList
方法返回ArrayList
的一個子類。然而:
- 這將是很多工作來設計,實施和測試。
- 您現在已經在您的代碼庫中添加了重要的新類,可能依賴於
ArrayList
類的未記錄方面(因此「可能會更改」)方面。
- 您需要更改代碼庫中的相關位置,以創建
ArrayList
實例來創建子類的實例。
「複製陣列」解決方案更實際...銘記這些不是真正的切片。
你爲什麼要堅持使用'ArrayList'?我認爲你可能會缺乏一點理解界面是如何工作的,因爲'List'和'ArrayList'不是「不兼容的」-ArrayList'實現'List','List'可能包含你需要的所有必要的方法。 – Bombe 2009-09-26 11:59:48
我堅持使用ArrayList,因爲它使用剛性方法原型的inteview問題。我顯然確實缺乏理解,因爲subList應該返回一個List類型,但我不能將返回的List轉換爲ArrayList。所以你告訴我的人.. – 2009-09-26 20:48:59
他完全有可能需要一個'ArrayList',因爲他需要調用一個接受'ArrayList'的方法。可以說,這樣的方法設計得不好,應該接受'List',但是這種情況不僅會出現在面試問題上,而且會出現在別人寫的代碼中,不能隨便去改變。同事和圖書館並不總是完美的。 – Gravity 2012-01-12 20:03:40