如何重写Double的compareTo方法?自定义方法未生效该如何解决?
嘿,我来帮你拆解下这个问题——你遇到的核心问题其实是几个基础的接口实现和集合使用的误区,咱们一步步理清楚:
我尝试重写compareTo方法,但发现编译器仍在使用java.lang.Double.compareTo方法而非我自定义的版本。请问问题出在哪里?我需要修改哪些内容才能让自定义的compareTo方法生效?
我的相关代码如下:
package GenerecEx; import java.util.ArrayList; import java.util.Collections; public class ArraySort implements Comparable{ double val; static ArrayList<Double> a=new ArrayList<Double>(); public static void main(String[] args) { a.add(2.4); a.add(8.4); a.add(9.4); a.add(... // 代码未写完,但不影响问题分析 } }
核心问题出在哪?
你的代码里有三个关键错误,直接导致自定义方法没被调用:
1. 没有用泛型实现
Comparable接口
你实现的是原始类型的Comparable,而不是带泛型参数的Comparable<ArraySort>。这不仅会触发编译警告,还会让Java无法识别你的自定义比较逻辑是针对ArraySort类的。2. 你在排序
Double对象,不是自己的ArraySort对象
你的集合a是ArrayList<Double>,存的是Java原生的Double包装类。当你调用Collections.sort(a)时,Java自然会用Double类自带的compareTo方法,和你的ArraySort类半毛钱关系都没有——你的自定义方法属于ArraySort,当然不会被触发。3. 没有正确重写
compareTo方法
就算你修正了上面两点,如果compareTo的方法签名不对(比如参数不是ArraySort类型),编译器会把它当成一个新方法,而非对Comparable接口方法的重写。
怎么修改才能让自定义方法生效?
按照下面的步骤一步步来:
步骤1:修正Comparable接口的泛型实现
把类定义改成带泛型的版本,明确比较的是同类型的对象:
public class ArraySort implements Comparable<ArraySort> {
步骤2:把集合改成存储ArraySort对象
把ArrayList<Double>换成ArrayList<ArraySort>,因为你要排序的是自己的类实例:
static ArrayList<ArraySort> a = new ArrayList<ArraySort>();
然后添加元素时要创建ArraySort对象,记得给类加个构造方法:
public ArraySort(double val) { this.val = val; } // 调用时改成这样 a.add(new ArraySort(2.4)); a.add(new ArraySort(8.4)); a.add(new ArraySort(9.4));
步骤3:正确重写compareTo方法
按照Comparable<ArraySort>的要求实现方法,加上@Override注解让编译器帮你检查签名是否正确:
@Override public int compareTo(ArraySort other) { // 这里写你的自定义逻辑,比如倒序排列 return Double.compare(other.val, this.val); // 如果要正序,就用 Double.compare(this.val, other.val) }
步骤4:调用排序并验证
在main方法里调用Collections.sort(a),现在就会用你自定义的比较逻辑了,还可以遍历输出看看结果:
Collections.sort(a); for (ArraySort item : a) { System.out.println(item.val); }
完整的修正后代码示例
package GenerecEx; import java.util.ArrayList; import java.util.Collections; public class ArraySort implements Comparable<ArraySort> { double val; static ArrayList<ArraySort> a = new ArrayList<ArraySort>(); public ArraySort(double val) { this.val = val; } @Override public int compareTo(ArraySort other) { // 示例:倒序排列 return Double.compare(other.val, this.val); } public static void main(String[] args) { a.add(new ArraySort(2.4)); a.add(new ArraySort(8.4)); a.add(new ArraySort(9.4)); a.add(new ArraySort(1.2)); Collections.sort(a); for (ArraySort item : a) { System.out.println(item.val); } } }
内容的提问来源于stack exchange,提问作者Prophet

