2

我正在查看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)

为什么会这样,我该如何解决?

4

5 回答 5

9

您没有覆盖方法add()

AbstractList的javadoc指出:

请注意,除非覆盖 add(int, Object),否则此实现会引发 UnsupportedOperationException。

解决方法是……覆盖该方法。或者不使用该add()方法,以便您MyArrayList的 ' 的大小是不可变的(但不是它的值) - 就像一个数组,这是您存储值的内容。

于 2012-05-30T21:00:58.940 回答
1

从抽象列表的java文档中:

“要实现可修改的列表,程序员必须额外覆盖 set(int, E) 方法(否则会引发 UnsupportedOperationException)。如果列表是可变大小的,程序员必须额外覆盖 add(int, E) 和 remove( int) 方法。”

您必须覆盖 add 方法:)

于 2012-05-30T21:03:12.890 回答
0

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

于 2012-05-30T21:00:58.690 回答
0

add在列表中是可选的。AbstractList 实现它以抛出异常。如果你想让它做其他事情,那么你可以简单地覆盖它。

于 2012-05-30T21:01:10.627 回答
0

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

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

于 2013-07-02T14:01:28.230 回答