【问题标题】:Java - How to subclass the generic ArrayList so that instances of MyArrayList<foo> will be subclasses of ArrayList<foo>?Java - 如何子类化通用 ArrayList,以便 MyArrayList<foo> 的实例成为 ArrayList<foo> 的子类?
【发布时间】:2012-05-15 13:04:46
【问题描述】:

我想保持我的子类通用,我想要更改的是 ArrayList 的 add(Object) 方法,这样当您调用 arrayList.add(null) 时它不会添加任何内容(ArrayList 的正常实现将添加 @987654323 @; 我希望它什么也不做)。

【问题讨论】:

  • 思想警察蜂拥而至。 OP 的要求已明确说明,我看不出有任何理由无法按要求回答该问题。 @fbafelip 已经展示了如何做到这一点。提到的委托替代方案需要更多数量级的代码。
  • 有很多方法可以将元素添加到ArrayList&lt;T&gt;(或任何List&lt;T&gt;):add( T )add( int, T )addAll( Collection&lt;T&gt; )addAll( int, Collection&lt;T&gt; )、通过构造函数和通过Iterator&lt;T&gt;ListIterator&lt;T&gt;add 方法,并通过以上任何一种方式修改subList 返回的视图。你需要处理所有这些吗?
  • 思想警察?真的,你要把我的回答比作极权国家吗?因为我所使用的只是权威的论据......正确的问题。
  • @AmirAfghani - 哈,我认为他的意思是您的答案具有读心的元素,而不是本质上是奥威尔式的*保持中立*
  • @truthreality 它仍然是可衡量的非零工作,并且作为新代码也必须进行测试。

标签: java generics arraylist


【解决方案1】:

在这种情况下,您确实应该支持组合而不是继承,因为如果您忘记覆盖 ArrayList 中添加/更改元素的方法之一(例如,您可能忘记覆盖 set),仍然可以有空元素。

但由于问题是关于如何子类化 ArrayList,下面是你的做法:

import java.util.ArrayList;

public class MyArrayList<T> extends ArrayList<T> {
    public boolean add(T element) {
        if (element != null) return super.add(element);
        return false;
    }
}

【讨论】:

  • 如果你能保证这是你修改数组列表行为的唯一地方,这个解决方案是合理的,因为这样这个实现细节对外部是透明的。
  • 你为什么不喜欢我编辑的版本?它的行为相同,但代码更好(有几个原因)。
  • @Bohemian 我只是想让它更加明确,因为它是一个示例代码。
【解决方案2】:

这是一个你应该更喜欢组合而不是继承的例子。

您应该创建一个具有ArrayList 成员字段并公开add 方法的类,而不是扩展ArrayList

阅读Effective Java。这是专门描述此问题的example

【讨论】:

  • 我同意他应该支持组合而不是继承,但也许他会将 ArrayList 传递给外部库,因此组合在这种情况下不起作用。他问的是如何继承它,而不是他是否应该。
  • 您的引用和示例不适用。 OP 特别想要无论超类的行为是什么。
  • 这确实对提问者没有帮助。他的下一个问题是: > 如何继承通用 List 以便 MyList 的实例成为 List 的子类?
  • @EJP 在我看来,Amir 的引用确实适用。是的,OP 的目标明确说明。是的,阿米尔没有回答提出的问题。但是,他提出了一个 OP 可能没有想到的好观点。虽然没有直接说明,但它确实看起来像 OP 的最终目标是在他的 List 中没有 null 值。根据ArrayList 的实现,对他的问题的直接回答可能会也可能不会给他这种行为。提供一个能够阐明潜在问题的答案而不是直接给出答案并没有错。
  • @EJP 请解释该示例如何不适用。我很乐意听到您使用我描述的方法无法实现 OP 要求的内容
【解决方案3】:

您是否考虑过实现一个过滤器来调用 add 方法?如果仅从代码中的一个位置调用它,那么这可能是最简单的。一个简单的 if 语句可能会起作用。

if (input/object != null) { 
    arrayList.add(input/object);
} 
else { 
    //do something else instead, or nothing
}

【讨论】:

    【解决方案4】:

    想要限制列表中的内容是完全值得尊重的,尽管默默地无视一个论点是值得怀疑的。尽管如此,这就是我们拥有Apache Commons Collections 的原因。可能有一个番石榴等价物。使用其中之一声明ArrayListfinal 子类,因此没有人可以颠覆您的意图。

    【讨论】:

      猜你喜欢
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2015-07-05
      • 1970-01-01
      相关资源
      最近更新 更多