Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
你能用Java扩展ArrayList吗?_Java_Arraylist_Extend - Fatal编程技术网

你能用Java扩展ArrayList吗?

你能用Java扩展ArrayList吗?,java,arraylist,extend,Java,Arraylist,Extend,是否可以生成扩展ArrayList的子类?如果是,如何扩展?您可以扩展Java中非final的任何类。话虽如此,如果没有真正的is-a关系,您应该避免继承。考虑重用的组成。读一读试试看。该类不是final,它的构造函数是公共的,因此您可以。然而,对于初学者来说,这可能不是一个好主意 大多数时候,这对任何人都不是好主意。假设您添加了一些功能并获得ExtList1扩展的ArrayList。你的一个学院添加了一个不同的独立功能,因此你有了ExtList2扩展了ArrayList。现在你想同时得到它们,

是否可以生成扩展ArrayList的子类?如果是,如何扩展?

您可以扩展Java中非final的任何类。话虽如此,如果没有真正的is-a关系,您应该避免继承。考虑重用的组成。读一读

试试看。该类不是final,它的构造函数是公共的,因此您可以。然而,对于初学者来说,这可能不是一个好主意

大多数时候,这对任何人都不是好主意。假设您添加了一些功能并获得
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
,尽管使用它几乎总是错误的)。这些都是代表团获胜的情况。当你说话的时候,不必再啰嗦了。