2011-01-24 103 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

相关问题