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

Abstract ListのJava ドキュメントから:

「変更可能なリストを実装するには、プログラマーは set(int, E) メソッドをさらにオーバーライドする必要があります (それ以外の場合は UnsupportedOperationException をスローします)。リストが可変サイズの場合、プログラマーは add(int, E) および remove( int) メソッド」です。

add メソッドをオーバーライドする必要があります:)

于 2012-05-30T21:03:12.890 に答える
0

まず第一に、本当に抽象リストを実装する必要がありますか? ほとんどの場合、Java List で十分です。

抽象クラスの実装の厄介な部分は、UnsupportedOperationException をスローするすべてのメソッドを実装する必要があることです。

于 2013-07-02T14:01:28.230 に答える
0

add可変リストが必要な場合は、メソッドを実装する必要があります。

于 2012-05-30T21:00:58.690 に答える
0

addリストではオプションです。AbstractList は、throw および例外にそれを実装します。他のことをしたい場合は、単純にオーバーライドできます。

于 2012-05-30T21:01:10.627 に答える