实现抽象列表

时间:2012-05-30 20:57:38

标签: java

我正在查看http://docs.oracle.com/javase/tutorial/collections/custom-implementations/index.html教程,我尝试做同样的事情:

class MyArrayList<T> extends AbstractList<T> {

    private final T[] a;

    MyArrayList(T[] array) {
        a = array;
    }

    @Override
    public T get(int index) {
        return a[index];
    }

    @Override
    public T set(int index, T element) {
        T oldValue = a[index];
        a[index] = element;
        return oldValue;
    }

    @Override
    public int size() {
        return a.length;
    }

    @Override
    public Object[] toArray() {
        return (Object[]) a.clone();
    }

    public static void main(String[] args) {
        String[] arr = {"one", "two", "three"};
        MyArrayList<String> list = new MyArrayList<String>(arr);
        list.get(1);
        list.add(1, "seven");
        System.out.println(list);
    }
}

尝试插入元素时出现异常:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.AbstractList.add(Unknown Source)

为什么,我该如何解决?

5 个答案:

答案 0 :(得分:9)

您没有覆盖方法add()

AbstractList的javadoc说明:

  

请注意,此实现会抛出UnsupportedOperationException   除非重写add(int,Object)。

修复是...覆盖方法。或者不使用add()方法,因此MyArrayList的大小是不可变的(但不是它的值) - 就像数组一样,这就是你存储值的方法。

答案 1 :(得分:1)

来自摘要清单的java documentation

“要实现可修改的列表,程序员必须另外覆盖set(int,E)方法(否则会抛出UnsupportedOperationException)。如果列表是可变大小的,程序员必须另外覆盖add(int,E)并删除(int)方法。“

您必须覆盖添加方法:)

答案 2 :(得分:0)

如果你想要一个可变列表,你需要实现add方法。

答案 3 :(得分:0)

add在列表中是可选的。 AbstractList将它实现为throw和exception。如果你想让它做其他事情,那么你可以简单地覆盖它。

答案 4 :(得分:0)

首先,你真的需要实现一个抽象列表吗?在大多数情况下,java List就足够了。

实现抽象类的烦人部分是你必须实现抛出UnsupportedOperationException的每个方法。