2012-03-06 53 views
0

我知道如何處理我的編程代碼,但我只是不知道爲什麼我們必須這樣做。實現列表ArrayList的方法

我的ArrayList類實現了一個列表< E>接口。這意味着我必須將我的List接口中的所有方法複製到我的ArrayList類中。這是爲了阻止我的ArrayList類的錯誤:「ArrayList不是抽象的,不會覆蓋抽象方法迭代器(int)」的錯誤。有人可以更詳細地向我解釋這一點嗎?

另外:當我使用的汽車在NetBeans正確的,它說每個方法之後的語句「拋出新UnsupportedOperationException異常(」尚不支持。「);」。爲什麼?

這裏是我的代碼:

public class ArrayList<E> implements List<E> { 

    private E[] elementData; 
    private int elementCount; 
    private int capacityIncrement; 
    private static final int INVALID_INDEX=-1; 
    private static final int DEFAULT_CAPACITY = 100; 

    public ArrayList() { 

     capacityIncrement = 0; 
     elementData = (E[]) new Object[DEFAULT_CAPACITY]; 
    } 

    public ArrayList(int capacity) { 

     this.capacityIncrement = 0; 
     this.elementData = (E[]) new Object[capacity]; 
    } 

    public ArrayList(int capacity, int increment) { 

     this.capacityIncrement = increment; 
     this.elementData = (E[]) new Object[capacity]; 
    } 

    private static class ArrayListIterator<E> implements Iterator<E> { 
     private ArrayListIterator(ArrayList c) { 

      elementData = c; 
     } 

    public interface List<E> { 

    public int size(); 

    public boolean isEmpty(); 

    public void clear(); 

    public boolean contains(E element); 

    public void add(E element); 

    public boolean remove(E element); 

    public E elementAt(int index); 

    public int indexOf(E element); 

    public void insertElementAt(E element, int index); 

    public void removeElementAt(int index); 

    public void setElementAt(E element, int index); 


    public void removeDuplicates(); 

    public void trimToSize(); 

    public Iterator<E> iterator(); 

    public Iterator<E> iterator(int index); 

    public String toString(); 
} 
+1

也許看一看教程上[接口](http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)。 – Jivings 2012-03-06 15:37:58

+0

你確定要設置'capacityIncrement = 0'嗎?這意味着,默認情況下,您的實施不會增長。當提供_negative_增量(或容量)時,'ArrayList(int,int)'怎麼辦?不要忘記你的邊界檢查!您可能會發現定義默認增量很有用,但我通常認爲它是基於百分比的。您也可能想要通過一個「基礎」構造函數來推動所有內容,其他人引用它來隱藏複雜性。 – 2012-03-06 16:54:28

+0

看看我的答案我認爲它應該可以解決您的問題。並且介意@ X-Zero的評論。 – alexvetter 2012-03-06 17:19:34

回答

1

您實現接口List所以你需要實現這是此接口中定義的所有方法。例外說明您應該將方法iterator()添加到ArrayList

接口就像您(您的班級)簽署的合同。您必須履行合同中定義的所有內容,換句話說,您需要從界面實施每個(抽象)方法。

編輯:我清理的代碼,現在你要做的唯一事情是用於實現與它// TODO評論每一個方法。

public class ArrayList<E> implements List<E> { 
    private Object[] elementData; 

    private int elementCount; 
    private int capacityIncrement; 

    private static final int INVALID_INDEX = -1; 
    private static final int DEFAULT_CAPACITY = 100; 

    public ArrayList() { 
     capacityIncrement = 0; 
     elementData = new Object[DEFAULT_CAPACITY]; 
    } 

    public ArrayList(int capacity) { 
     this.capacityIncrement = 0; 
     this.elementData = new Object[capacity]; 
    } 

    public ArrayList(int capacity, int increment) { 
     this.capacityIncrement = increment; 
     this.elementData = new Object[capacity]; 
    } 

    @Override 
    public int size() { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public boolean isEmpty() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void clear() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean contains(E element) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void add(E element) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public boolean remove(E element) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public E elementAt(int index) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int indexOf(E element) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public void insertElementAt(E element, int index) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void removeElementAt(int index) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void setElementAt(E element, int index) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void removeDuplicates() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void trimToSize() { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public Iterator<E> iterator() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Iterator<E> iterator(int index) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    protected class ArrayListIterator<T> implements Iterator<T> { 
     private ArrayList<T> list; 

     private ArrayListIterator(ArrayList<T> list) { 
      this.list = list; 
     } 

     @Override 
     public boolean hasNext() { 
      // TODO Auto-generated method stub 
      return false; 
     } 

     @Override 
     public T next() { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public void remove() { 
      // TODO Auto-generated method stub 

     } 
    } 
} 

interface List<T> { 
    public int size(); 

    public boolean isEmpty(); 

    public void clear(); 

    public boolean contains(T element); 

    public void add(T element); 

    public boolean remove(T element); 

    public T elementAt(int index); 

    public int indexOf(T element); 

    public void insertElementAt(T element, int index); 

    public void removeElementAt(int index); 

    public void setElementAt(T element, int index); 

    public void removeDuplicates(); 

    public void trimToSize(); 

    public Iterator<T> iterator(); 

    public Iterator<T> iterator(int index); 

    public String toString(); 
} 
0

由於您在說您的類「實現了List」,因此它必須實現List接口中定義的所有方法。接口就像是一個抽象的規範類,指定你的類可以做(它的方法),也無需提供有關你的類包含/它如何完成其​​工作

+0

當我在NetBeans中使用自動更正時,它說每個方法後面的語句「throw new UnsupportedOperationException(」Not supported yet。「);」爲什麼? – IC2D 2012-03-06 15:39:20

+0

如果您在IDE中自動實現這些方法,它通常會添加這些類型的例外,以提醒您必須實施它們。例外只是臨時存根代碼。 – arc 2012-03-06 15:40:39

1

接口是指出某種功能的合同的細節將由任何實現它的類提供。這是通過指定每個方法簽名來完成的(但是,通常沒有方法體 - 所以沒有實際的實現邏輯)。所以,如果你有一個實現了這個接口的類,你必須爲每個方法提供實現,以便你的類實現那個合約。

2

既然你實現的接口,你必須實現它的所有聲明(除非你的類是abstract)的方法。看看關於繼承的Java tutorial trail