ComparableTriangle未实现Comparable方法致Collections.sort报错求助
解决Collections.sort调用时的Comparable接口实现错误
问题原因
你代码的核心问题是Comparable接口的泛型声明与重写的compareTo方法参数不匹配:
ComparableTriangle类声明实现了Comparable<Triangle>,这要求必须重写int compareTo(Triangle o)方法- 但你实际编写的是
int compareTo(ComparableTriangle param),这不是对接口方法的重写,只是同名重载方法。JVM在运行时找不到接口要求的实现方法,因此抛出异常。 - 你尝试改成
implements Comparable(无泛型)时,需要重写int compareTo(Object o),但仍使用ComparableTriangle作为参数,依旧未满足接口要求,所以报错持续。
解决方案
推荐第一种更简洁的修改方式:
方式一:调整泛型类型为当前类
将类声明中的implements Comparable<Triangle>改为implements Comparable<ComparableTriangle>,让compareTo的参数类型与接口要求完全匹配:
class ComparableTriangle extends Triangle implements Comparable<ComparableTriangle>, Cloneable { /** Construct a ComparableTriangle with specified properties */ public ComparableTriangle(double side1, double side2, double side3) { super(side1, side2, side3); } // Compares the object (t) to the parameter being input (t2) @Override public int compareTo(ComparableTriangle param) { if (this.getArea() > param.getArea()) { // this > t1 System.out.println("Triangle 1 is bigger."); return 1; } else if (this.getArea() < param.getArea()) { System.out.println("Triangle 2 is bigger."); return -1; } else { System.out.println("Both triangles are equal."); return 0; } } // Clones the object input. Throws exception if not supported. protected Object clone() throws CloneNotSupportedException { { System.out.println(this.getArea()); System.out.println(this.getPerimeter()); return super.clone(); } } }
方式二:保持泛型为Triangle,修改compareTo参数类型
如果需要和所有Triangle子类比较,可将compareTo的参数改为Triangle并添加类型检查:
class ComparableTriangle extends Triangle implements Comparable<Triangle>, Cloneable { /** Construct a ComparableTriangle with specified properties */ public ComparableTriangle(double side1, double side2, double side3) { super(side1, side2, side3); } // Compares the object (t) to the parameter being input (t2) @Override public int compareTo(Triangle param) { if (!(param instanceof ComparableTriangle)) { throw new IllegalArgumentException("仅支持与ComparableTriangle实例比较"); } ComparableTriangle other = (ComparableTriangle) param; if (this.getArea() > other.getArea()) { // this > t1 System.out.println("Triangle 1 is bigger."); return 1; } else if (this.getArea() < other.getArea()) { System.out.println("Triangle 2 is bigger."); return -1; } else { System.out.println("Both triangles are equal."); return 0; } } // Clones the object input. Throws exception if not supported. protected Object clone() throws CloneNotSupportedException { { System.out.println(this.getArea()); System.out.println(this.getPerimeter()); return super.clone(); } } }
补充说明
单独创建对象调用compareTo时正常,是因为你调用的是自己重载的compareTo(ComparableTriangle)方法,但Collections.sort内部会调用接口定义的标准compareTo方法,而你未正确实现该方法,因此运行时触发异常。
内容的提问来源于stack exchange,提问作者DrDallas
相关产品推荐
相关产品推荐

