【问题标题】:Implement methods of an implemented List to an ArrayList将已实现 List 的方法实现为 ArrayList
【发布时间】:2012-03-06 15:34:38
【问题描述】:

我知道如何处理我的编程代码,但我只是不知道为什么我们必须这样做。

我的 ArrayList 类实现了一个 List 接口。这意味着我必须将我的 List 接口中的所有方法复制到我的 ArrayList 类。这是为了阻止我的 ArrayList 类的错误说:“ArrayList 不是抽象的,并且不会覆盖抽象方法迭代器(int)”错误。有人可以更详细地向我解释一下吗?

另外:当我在 NetBeans 中使用自动更正功能时,它会在每个方法后显示语句“throw new UnsupportedOperationException("Not supported yet.");”。为什么?

这是我的代码:

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();
}

【问题讨论】:

  • 或许可以看看Interfaces上的教程。
  • 您确定要设置capacityIncrement = 0吗?这意味着,默认情况下,您的实现不会扩大规模。当提供增量(或容量)时,ArrayList(int, int) 呢?不要忘记边界检查!您可能会发现定义默认增量很有用,尽管我认为通常它是基于百分比的。您可能还希望通过一个“基本”构造函数推送所有内容,其他人引用该构造函数以隐藏复杂性。
  • 看看我的回答,我认为它应该可以解决您的问题。请注意@X-Zero 的评论。

标签: java


【解决方案1】:

既然你实现一个接口,你必须实现它声明的所有方法(除非你的类是abstract)。看看Java tutorial trail 的继承。

【讨论】:

    【解决方案2】:

    接口是一种契约,它规定实现它的任何类都将提供某些功能。这是通过指定每个方法签名来完成的(但通常没有方法体 - 所以没有实际的实现逻辑)。因此,如果您有一个实现该接口的类,则必须为每个方法提供实现,以便您的类履行该约定。

    【讨论】:

      【解决方案3】:

      您实现了接口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();
      }
      

      【讨论】:

        【解决方案4】:

        既然你说你的类“实现了 List”,它必须实现 List 接口中定义的所有方法。接口就像你的类的抽象规范,指定你的类可以做什么(它的方法),而不提供关于你的类包含什么/它是如何工作的细节

        【讨论】:

        • 当我在 NetBeans 中使用自动更正时,它会在每个方法后显示语句“throw new UnsupportedOperationException("Not supported yet.");"为什么?
        • 如果您在 IDE 中自动实现这些方法,它通常会添加这些类型的异常以提醒您必须实现它们。例外只是临时存根代码。
        猜你喜欢
        • 2012-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-06
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多