你能用Java扩展ArrayList吗?
是否可以生成扩展ArrayList的子类?如果是,如何扩展?您可以扩展Java中非final的任何类。话虽如此,如果没有真正的is-a关系,您应该避免继承。考虑重用的组成。读一读试试看。该类不是final,它的构造函数是公共的,因此您可以。然而,对于初学者来说,这可能不是一个好主意 大多数时候,这对任何人都不是好主意。假设您添加了一些功能并获得你能用Java扩展ArrayList吗?,java,arraylist,extend,Java,Arraylist,Extend,是否可以生成扩展ArrayList的子类?如果是,如何扩展?您可以扩展Java中非final的任何类。话虽如此,如果没有真正的is-a关系,您应该避免继承。考虑重用的组成。读一读试试看。该类不是final,它的构造函数是公共的,因此您可以。然而,对于初学者来说,这可能不是一个好主意 大多数时候,这对任何人都不是好主意。假设您添加了一些功能并获得ExtList1扩展的ArrayList。你的一个学院添加了一个不同的独立功能,因此你有了ExtList2扩展了ArrayList。现在你想同时得到它们,
ExtList1扩展的ArrayList
。你的一个学院添加了一个不同的独立功能,因此你有了ExtList2扩展了ArrayList
。现在你想同时得到它们,你就不走运了
或者,您需要相同的功能和不同的基本列表实现(可能是LinkedList
,尽管使用它几乎总是错误的)。又是出于运气
这些都是代表团获胜的情况。当你说话的时候,不必再啰嗦了
我只会从
ArrayList
继承,如果有很好的理由这样做的话。可能是基于正确的JMH基准测试的一些真正极端的性能要求。是的,您可以
public class MyArrayList<E> extends ArrayList<E>
{
}
公共类MyArrayList扩展了ArrayList
{
}
但是,我不确定您为什么要这样做。ArrayList不是最终类,它提供了公共构造函数,所以从技术上讲它可以扩展 但最佳实践是授权而不是扩展。
请参阅:正如许多其他人所说,是的,您可以扩展类
ArrayList
,但这不是您通常应该做的事情;在Java中,这被认为是不好的实践
我主要是一名Java程序员,但在过去的几个月里,我也一直在研究C代码。如果需要特定类型的集合,扩展标准集合类似乎是C#中的一个常见习惯用法(实际上我不知道这是否是一个通用习惯用法-至少编写我正在使用的代码的人一直在这样做)
因此,如果他们有一个类Person
,并且他们需要一个Person列表,他们会创建一个类PersonList
,它扩展了与ArrayList
等价的C
如果需要Person
对象的列表,Java中的常见习惯用法就是使用ArrayList
,而不是为此创建特定的子类
我建议您坚持使用常见的Java方式,不要创建自己的
ArrayList
子类或其他集合类。正如其他人所说,扩展Java语言数据结构是一个非常糟糕的主意。
但是,如果您想在集合类中隔离某些逻辑,我建议使用以下解决方案:
public class ProductCollection{
ArrayList<Product> products;
public Product getByCode(String code) {
// ... your logic goes here.
}
}
公共类ProductCollection{
ArrayList产品;
公共产品getByCode(字符串代码){
//…你的逻辑在这里。
}
}
@Rakesh Juyal是的,我尝试过,但遇到了一些问题。所以我只是想确定一下。嗯。。。在所有情况下使用委托而不是继承不是最佳实践。你应该根据具体情况做出决定。当然,要将其重命名为比ArrayList更棒的名称。->列表l=新的MySuperAwesomeSandwichMakingConstantTimeLookupSwissArmyList();抱歉,我太笨了,但是E是什么意思?@IchHabsDrauf创建ArrayList时,需要指定列表将保存的类型。例如“newarraylist()”。因此,E是该类型的占位符(在本例中是字符串)。这称为“泛型类型”。如果您创建MyArrayList的实例,您将按照如下方式执行:new MyArrayList()。这将把类型“String”传递给ArrayList的泛型类型,从而创建ArrayList的父级。既然您建议不要重写该类,那么当一个项被添加到列表中时,我将如何获得回调?@Sipty对于类似的情况,您确实希望添加新功能,而不是仅将其与特定类型参数一起使用(如我上面的描述所示),在我看来,创建一个子类是合法的。@Sipty重写是一个选项,但是想象一下你的学院添加了一个不同的独立功能,因此你有ExtList1扩展ArrayList
和ExtList2扩展ArrayList
。现在你想同时得到它们,你就不走运了。或者,您需要相同的功能和不同的基本列表实现(可能是LinkedList
,尽管使用它几乎总是错误的)。这些都是代表团获胜的情况。当你说话的时候,不必再啰嗦了。