这是我已经研究了一段时间的问题,而且我几乎没有取得任何进展。在扩展ArrayList时尝试使用抽象类时遇到了很多问题。

我的第一步是定义三个类,Circle,Rectangle和Triangle,它们都是抽象类GeometricObject的具体子类。基类具有抽象方法getArea()getPerimeter(),这些抽象方法在子类中被该特定对象的特定getPerimeter()getArea()公式覆盖。本部分已完成,并且按预期工作。

下一部分是我遇到麻烦的地方。我应该定义一个扩展GeoemetricObjectList的新类ArrayList<GeometricObject>。此类应覆盖add()remove()clear()方法。此类在列表上保留对象的totalArea和totalPerimeter变量。

现在,坦率地说,我在我要清除的GeometricObjectList add()方法中创建了一个凌乱的if语句列表。到目前为止,这是我该课程的代码:

import java.util.ArrayList;

@SuppressWarnings("hiding")
public class GeometricObjectList<GeometricObject> extends ArrayList<GeometricObject>{

    final static long serialVersionUID = 1L;

    public double totalArea = 0;
    public double totalPerimeter = 0;


    public boolean add(GeometricObject element){
        if(element instanceof Rectangle) {
            totalArea += ((Rectangle)element).getArea();
            totalPerimeter += ((Rectangle)element).getPerimeter();
        }
        if(element instanceof Circle) {
            totalArea += ((Circle)element).getArea();
            totalPerimeter += ((Circle)element).getArea();
        }
        if(element instanceof Triangle) {
            totalArea += ((Triangle)element).getArea();
            totalPerimeter +=((Triangle)element).getArea();
        }

        return super.add(element);
    }

    public boolean remove(GoemetricObject element) {

        return super.remove(element);
    }

    public void clear() {

    }

}


当我简单地写totalArea += element.getArea()时,会出现错误“对于类型GeometricObject,未定义方法getArea(),但在我的GeometricObject类中,我有一个公共摘要getArea(),在每个混凝土中,该摘要都由getArea()方法覆盖(三角形,圆,矩形)类。

我的下一个问题是GeometricObjectList中的remove()方法。看起来像这样:

public boolean remove(GeometricObject element) {

    return super.remove(element);
}


我收到错误消息“名称冲突:类型为GeometricObjectList<GeometricObject>的方法remove(GeometricObject)具有与ArrayList类型的remove(Object)相同的擦除,但是没有覆盖它”。创建add()方法时,我从未收到此错误。

非常感谢您的任何帮助。如果有更多信息,您需要索取,我将在一秒钟之内完成!

最佳答案

您确实遇到了几个不同的问题-包括拼写和隐藏,

// Make sure you have these methods in your GeometricObject.
// private static abstract class GeometricObject {
//  public abstract double getArea();
//  public abstract double getPerimiter();
// }

// Do not use that annotation. It was warning you!
public class GeometricObjectList extends
    ArrayList<GeometricObject> {

  final static long serialVersionUID = 1L;

  public double totalArea = 0;
  public double totalPerimeter = 0;

  public boolean add(GeometricObject element) {
    if (element != null && super.add(element)) {
      totalArea += element.getArea(); // add area
      totalPerimeter += element.getPerimiter(); // add perimeter
      return true;
    }
    return false;
  }

  public boolean remove(GeometricObject element) { // Spelling!
    if (element != null && super.remove(element)) {
      totalArea -= element.getArea(); // subtract area
      totalPerimeter -= element.getPerimiter(); // subtract perimeter
      return true;
    }
    return false;
  }

  public void clear() {
    super.clear();
  }
}

关于java - 用Java中的抽象类扩展ArrayList?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23235129/

10-09 03:50