Java如何基于对象属性排序对象数组及解决Comparable接口实现报错
问题排查
你的代码存在以下几个核心问题:
- 泛型使用错误:
Comparable是泛型接口,你没有指定泛型参数的情况下,默认要实现的是compareTo(Object o)方法,而你写的compareTo(Vehicle o)属于方法重载,不是接口方法的实现,因此继承Vehicle的非抽象子类(Car、Bike)会被要求实现剩余的抽象方法Comparable.compareTo(Object),直接触发你遇到的报错。 - 变量名拼写错误:你创建的
Car实例命名为Lamborghini,赋值时写成了Lamborgini;Bike实例命名为BMX,赋值时写成了Bmx,大小写不一致,编译会报错。 - 缺少
java.util.Arrays导入:代码中调用了Arrays.sort(),如果没有导入对应包会编译失败。 compareTo逻辑不符合需求:当前固定返回-1,没有按seats属性实现排序逻辑,即使编译通过排序结果也不符合预期。- 遗漏必要基础代码:你原有代码缺少父类构造方法、子类
Car和Bike的定义、toString打印方法,会直接导致实例化、打印环节报错。
修正后代码
import java.util.Arrays; // 指定Comparable的泛型为Vehicle,从根源解决接口方法实现不匹配的问题 public abstract class Vehicle implements Comparable<Vehicle> { protected int seats; protected int wheels; protected int price; protected int weight; // 补充父类构造方法,供子类实例化调用 public Vehicle(int seats, int wheels, int price, int weight) { this.seats = seats; this.wheels = wheels; this.price = price; this.weight = weight; } // 正确重写compareTo方法,按seats升序排序;如果需要降序,调换this.seats和o.seats的位置即可 @Override public int compareTo(Vehicle o) { return Integer.compare(this.seats, o.seats); } // 补充toString方法,方便排序后打印内容 @Override public String toString() { return "Vehicle{" + "seats=" + seats + ", wheels=" + wheels + ", price=" + price + ", weight=" + weight + '}'; } public static void main(String [] args) { Car Lamborghini = new Car(5,4,30000, 1500); Bike BMX = new Bike(1,2,300, 15); Vehicle Vehicles[] = new Vehicle[2]; // 修正变量名拼写错误 Vehicles[0] = Lamborghini; Vehicles[1] = BMX; Arrays.sort(Vehicles); for(int i=0;i<Vehicles.length;i++) { System.out.println(Vehicles[i]); } } } // 补充Car子类实现 class Car extends Vehicle { public Car(int seats, int wheels, int price, int weight) { super(seats, wheels, price, weight); } } // 补充Bike子类实现 class Bike extends Vehicle { public Bike(int seats, int wheels, int price, int weight) { super(seats, wheels, price, weight); } }
内容的提问来源于stack exchange,提问作者Dave
相关产品推荐
相关产品推荐

