2011-01-24 101 views

回答

13

你可以擴展任何類,是不是在Java中最後。話雖如此,如果沒有真是is-a的關係,你應該避免繼承。考慮構成重用。閱讀關於Liskov substitution principle

3

爲什麼不呢?

import java.util.ArrayList; 

public class Foo<T> extends ArrayList<T> { 
    // ... 
} 
0

試試吧。這個類不是最終的,它的構造函數是公共的,所以你可以。但是,初學者可能不是個好主意。

大多數時候,對任何人來說都不是好主意。想象一下,你添加一些功能,並得到ExtList1 extends ArrayList。你們大學增加了不同的獨立功能,所以你有ExtList2 extends ArrayList。現在你想要他們,而且你運氣不好。

或者您需要使用不同基本列表實現的相同功能(可能是LinkedList,儘管使用它實際上總是錯誤的)。再次,運氣不好。

這些都是代表團獲勝時的情況。當someone has created the base already時,它不需要更詳細。


我只從ArrayList繼承,如果有一個很好的理由正是該做的事情。也許一些真正極端性能要求基於正確的JMH基準。

19

是的,你可以。

public class MyArrayList<E> extends ArrayList<E> 
{ 
} 

但是,我不知道爲什麼你會想這樣做。

+41

重命名它比ArrayList更令人敬畏的方式,當然。 - > List l = new MySuperAwesomeSandwichMakingConstantTimeLookupSwissArmyList(); – b3bop

+0

haha​​hahhhahabhahahahaha幽默回覆...暴徒生活b3op –

+0

把一個斷點,例如 –

6

是的,ArrayList不是final。使用這種方法。

class Foo<T> extends ArrayList<T> 
4
import java.util.ArrayList; 

public class MyArrayList<T> extends ArrayList<T> { 

    //Add extra or override methods here... 

} 
2

的ArrayList是不是最終的類,它提供了公共的構造,所以在技術上可以延長。

但最佳做法是代表而不是延長。 請參閱:Decorator pattern

+7

嗯......在所有情況下,**都不是使用委託代替繼承**的最佳實踐。你應該根據具體情況做出決定。 –

8

正如許多其他人所說,是的,你可以擴展類ArrayList,但它不是你通常應該做的;在Java中它不被認爲是好的做法。

我主要是一個Java程序員,但過去幾個月我也一直在研究C#代碼。如果你需要一個特定類型的集合,它似乎是C#中擴展標準集合類的一個常見習慣用法(我實際上不知道它是否是一般的普通習慣用法 - 至少編寫代碼的人是'我一直在做這件事)。

所以,如果他們有一個類Person,他們需要的人的名單,他們會創建一個類PersonList,它擴展了C#相當於ArrayList<Person>

如果您需要一個Person對象的列表,而不是爲此創建特定的子類,Java中常見的習慣用法就是使用ArrayList<Person>

我建議你堅持使用常見的Java方法,而不是創建自己的ArrayList或其他集合類的子類。

+0

嘿。既然你建議不要重寫這個類,那麼當一個項目被添加到一個列表中時,我將如何獲得回調? – Sipty

+2

@Sipty對於這樣的事情,你真的想添加新的功能,而不是隻使用特定的類型參數(如我在上面的描述中),在我看來,創建一個子類是合法的。 – Jesper

+1

@Sipty覆蓋是一個選項,但想象你的大學增加了一個不同的獨立功能,所以你有'ExtList1擴展ArrayList'和'ExtList2擴展ArrayList'。現在你想要他們,而且你運氣不好。或者你需要與不同的基礎列表實現相同的功能(也許'LinkedList',儘管使用它實際上總是錯誤的)。這些都是代表團獲勝的情況。當[某人已經創建了該基礎]時,它不必更冗長(https://google.github.io/guava/releases/23.0/api/docs/com/google/common/collect/ForwardingList.html)。 – maaartinus

相關問題