2012-05-30 103 views
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) 

這是爲什麼,我如何解決它?

回答

9

你是不是覆蓋方法add()

javadoc爲AbstractList的狀態:

注意,此實現拋出UnsupportedOperationException 除非加(INT,Object)已被覆蓋。

解決方法是...要覆蓋的方法。所以你MyArrayList的大小是不變的(但不是它的值)或不使用add()方法 - 比如一個陣列,這是你存儲你的價值在什麼

0

您需要實現add方法,如果你想有一個可變的列表。

0

add是名單可選。 AbstractList將它實現爲拋出和異常。如果你想要做其他事情,那麼你可以簡單地覆蓋它。

1

從抽象列表的java documentation

「爲了實現可修改的列表,程序員必須另外重寫設定(INT,E)方法(其否則會拋出UnsupportedOperationException)若該列表是可變長程序員必須另外重寫該外接(INT,E)和刪除(INT)的方法「。

你必須重寫add方法:)

0

首先,你真的需要實現一個抽象的名單?在大多數情況下,Java List對你來說已經足夠了。實現一個抽象類的

惱人的部分是你必須實現每個其拋出UnsupportedOperationException方法。