抽象类Shape的子类数组调用Arrays.sort排序报错如何修复?
问题原因
将Shape声明为抽象类本身不会直接导致Arrays.sort(arr3, Shape::compare)运行报错,你遇到的问题基本是修改类定义时的操作失误导致:你大概率将原本有具体实现的compare方法、或者getShapeColor()方法误设置为了抽象方法,导致方法没有可执行的具体逻辑。
修复方案
方案1:保留现有调用逻辑,修正Shape抽象类定义
只需要确保Shape抽象类中的compare方法和getShapeColor方法保留具体实现即可,不需要修改排序代码,Shape类示例代码如下:
public abstract class Shape { // 私有颜色字段 private String shapeColor; // 构造方法,供子类调用 public Shape(String shapeColor) { this.shapeColor = shapeColor; } // get方法保留具体实现 public String getShapeColor() { return shapeColor; } // compare方法保留具体实现,不要加abstract修饰符 public int compare (Shape obj) { return this.getShapeColor().compareTo(obj.getShapeColor()); } // 其他你需要定义的抽象方法(比如计算面积、周长等)不影响现有排序逻辑 public abstract double getArea(); }
修改后原排序代码Arrays.sort(arr3, Shape::compare)可直接正常运行。
方案2:实现Comparable接口(更符合Java编码规范)
如果你希望Shape类本身支持自然排序,更推荐让Shape抽象类实现Comparable<Shape>接口,代码如下:
public abstract class Shape implements Comparable<Shape> { private String shapeColor; public Shape(String shapeColor) { this.shapeColor = shapeColor; } public String getShapeColor() { return shapeColor; } // 重写compareTo方法实现按颜色排序 @Override public int compareTo(Shape o) { return this.shapeColor.compareTo(o.getShapeColor()); } public abstract double getArea(); }
对应排序代码可以简化为:
Arrays.sort(arr3);
内容的提问来源于stack exchange,提问作者multihacker
相关产品推荐
相关产品推荐

