矩形不能转换为Circle?

时间:2015-10-13 16:58:43

标签: java object casting dynamic-arrays

所以我试图编写一个方法来返回具有最大区域的对象的索引。这是我目前的方法

private static int findPositionLargestObject(ArrayList < GeometricObject > geoList) {
    int maxIndexC = 0;
    int maxIndexR = 0;
    for (GeometricObject o: geoList) {
        for (int i = 1; i < geoList.size(); i++) {
            if (o instanceof Rectangle) {
                if (((Rectangle) geoList.get(i)).getArea() > ((Rectangle) geoList.get(maxIndexR)).getArea()) {
                    maxIndexR = i;
                }
            }
            if (o instanceof Circle) {
                if (((Circle) geoList.get(i)).getArea() > ((Circle) geoList.get(maxIndexC)).getArea()) {
                    maxIndexC = i;
                }
            }

        }
    }
    if (maxIndexC > maxIndexR) {
        return maxIndexC;
    } else return maxIndexR;
}

但是,当我运行此方法时,我收到错误消息矩形无法转换为圆形。我有两个不同的if语句的原因是因为getArea方法分别对于圆形和矩形对象是不同的。我收到此消息的任何想法,谢谢!

这是我的公开课

public class hw2redo 
{
     public static void main(String[] args) throws FileNotFoundException {

          GeometricObject g = null;
          File diskFile = new File("file.txt");
          Scanner diskScanner = new Scanner(diskFile);
          ArrayList<GeometricObject> list = new ArrayList<GeometricObject>();
          while(diskScanner.hasNext()){
              String geolist = diskScanner.nextLine();
              g = recreateObject(geolist);

              list.add(g);

          }
          diskScanner.close();
         /* while (diskScanner.hasNext()) {
              String list = diskScanner.nextLine();
              g = recreateObject(list);
          }
          diskScanner.close();*/
          showObjects(list);
          findPositionLargestObject(list);
       }





    private static GeometricObject recreateObject(String data) {

          String[] list = data.split(",");
          String geoObject = list[0];

          if (geoObject.equals("Circle")) {
             String color = list[1];
             boolean filled = Boolean.valueOf(list[2]); 
             double radius = Double.valueOf(list[3]);
             return new Circle(radius, color, filled);
          }

          if (geoObject.equals("Rectangle")) {
             String color = list[1];
             boolean filled = Boolean.valueOf(list[2]);
             double height = Double.valueOf(list[3]);
             double width = Double.valueOf(list[4]);
             return new Rectangle(width, height, color, filled);
          }
        return null;


       }

    private static void showObjects(ArrayList<GeometricObject> list) {

         for(GeometricObject o : list) {

             if ( o instanceof Circle)
             {
             System.out.println(o);
             ((Circle) o).printCircle();
             System.out.println("");
             }
             if ( o instanceof Rectangle)
             {
             System.out.println(o);
             ((Rectangle) o).printRectangle();
             System.out.println("");
             }
         }
    }
      private static int findPositionLargestObject(ArrayList<GeometricObject> geoList) {

            int maxIndexC = 0;
            int maxIndexR = 0;
            for(GeometricObject o : geoList)
            {
            for (int i = 1; i < geoList.size(); i++) {
                if ( o instanceof Rectangle)
                {
                if (((Rectangle) geoList.get(i)).getArea() > ((Rectangle) geoList.get(maxIndexR)).getArea()) {
                    maxIndexR = i;
                }
                }
                if ( o instanceof Circle)
                {
                if (((Circle) geoList.get(i)).getArea() > ((Circle) geoList.get(maxIndexC)).getArea()) {
                        maxIndexC = i;
                }
                }

            }
        }
           if (maxIndexC > maxIndexR)
           {
               return maxIndexC;
           }
           else
               return maxIndexR;
     }
}

4 个答案:

答案 0 :(得分:2)

您为每个对象循环遍历数组两次。

for (GeometricObject o: geoList) { // for each GeometricObject in geoList, 
    for (int i = 1; i < geoList.size(); i++) { // loop through each object in geoList.

删除for-each循环或常规for循环。

答案 1 :(得分:2)

由于没有为GeometricObject提供代码,但我认为在getArea()中以某种方式定义GeometricObject,所以为什么即使使用强制转换,如果您可以直接评估它:

int max_circle , area_circle;
int max_rect , area_rec;

for(int i = 0 ; i < geoList.size() ; i++){
    GeometricObject go = geoList.get(i);

    if(go instanceof Rectangle)
        if(go.getArea() > area_rec){
            area_rec = go.getArea();
            max_rect = i;
        }else{
            area_circle = go.getArea();
            max_circle = i;
        }
}

您的代码抛出异常的原因是:

((Rectangle) geoList.get(maxIndexR))

maxIndexR初始化为0,圆圈相同。因此,如果geoList中的第一个元素是Rectangle,则第一个圆圈将调用((Circle) geoList.get(0)),但第一个元素是Rectangle。这同样适用于另一种方式。如果你想保留你的代码,只需添加另一个变量来存储圆和矩形的最大区域,只需使用这些值(初始化为0),而不是从列表中检索形状并进行投射。

答案 2 :(得分:0)

您正在检查oRectangle / Circle的实例,而是将geoList.get(i)转换为相应的类型。实际上,除o项检查外,instanceof不会在循环中的任何位置使用。

答案 3 :(得分:0)

根据我的理解,你将有两个类,Rectangle和Circle,从你最后的一个名为Geometry的常见类扩展而来。这里要注意的一件重要事情是Rectangle和Circle将是兄弟姐妹。这是一个矩形永远不是一个圆而反之亦然。此语句的直接结果是您不能将Rectangle实例视为Circle实例,反之亦然。

在您的方法findPositionLargestObject中,maxIndexCmaxIndexR初始化为0.虽然这听起来无害,但您可以这样做:

            if ( o instanceof Rectangle)
            {
            if (((Rectangle) geoList.get(i)).getArea() > ((Rectangle) geoList.get(maxIndexR)).getArea()) {

//最初为'0'的maxIndexR保持Rectangle而不是Circle?的保证是什么?                     maxIndexR = i;                 }                 }                 if(o instanceof Circle)                 {                 if(((Circle)geoList.get(i))。getArea()&gt;((Circle)geoList.get(maxIndexC))。getArea()){ //最初为'0'的maxIndexC保持Circle而不是Rectangle的保证是什么?                         maxIndexC = i;                 }                 }

当然有一些谬误。此外,如果您只有两种几何图形,则可以使用if else而不是两个if clauses。这将是更多的错误证明。