Java - 如何子类化通用ArrayList,以便MyArrayList <foo>的实例将成为ArrayList <foo>的子类?</foo> </foo>

时间:2012-05-06 23:07:43

标签: java generics arraylist

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

4 个答案:

答案 0 :(得分:14)

在这种情况下,你真的应该支持组合而不是继承,因为如果你忘记覆盖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;
    }
}

答案 1 :(得分:10)

这是一个你应该支持组合而不是继承的例子。

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

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

答案 2 :(得分:0)

您是否考虑过实施过滤器来调用add方法?如果只从代码中的一个地方调用它,那么这可能是最简单的。一个简单的if语句可能有用。

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

答案 3 :(得分:0)

想要限制进入List的内容是完全可敬的,尽管默默地忽略一个参数是值得怀疑的。不过,这就是我们Apache Commons Collections的原因。可能有番石榴等同物。使用其中一个来声明final的{​​{1}}子类,这样就没有人能够颠覆你的意图。