2012-03-06 54 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