使用Comparator比较器时触发ClassCastException异常问题求解
异常根因
运行时抛出java.lang.ClassCastException的直接触发点在redComp.compare方法的类型强转逻辑,根本问题出在Corso.minimo方法的初始值定义错误:
minimo方法中初始化比较基准值时写了Object max = new Object();,生成的是纯Object类实例,和Studente类无继承关系- 第一次循环执行比较时,这个纯Object实例会被传入
compare方法,被强制转换为Studente类型,直接触发类型转换异常 - 额外存在2个隐性问题:
- 方法名
minimo(语义为找最小值)、输出文案“最低收入”和现有比较逻辑不匹配:现有逻辑c.compare(a[i],max)>0时替换基准值,实际是在找最大值 - 代码缺失
Comparator、Arrays的导入语句,未修正的情况下编译阶段就会报错
- 方法名
修复步骤
- 第一步:补全文件头部缺失的导入语句
- 第二步:修改
minimo方法的初始值逻辑,不再new空Object实例,直接取数组第一个元素作为初始比较基准,保证参与比较的对象类型一致 - 第三步:调整比较判断逻辑,匹配“找最低收入学生”的需求
- (可选优化)给
Comparator加上泛型定义,去掉不必要的Object强转,提升编译期类型安全
修复后完整可运行代码
import java.util.Arrays; import java.util.Comparator; class Studente { int matricola; int reddito; int eta; Studente(int matricola, int reddito, int eta) { this.matricola = matricola; this.reddito = reddito; this.eta = eta; } public String toString() { return "matricola: " + matricola + ", reddito: " + reddito + ", eta: " + eta; } } public class Corso { Studente[] studenti; Corso(int n) { studenti = new Studente[n]; for (int i=0; i<n; i++) { studenti[i] = new Studente(i, i*10, i*2); } } Object minimo(Object a[], Comparator c) { // 修正:取数组第一个元素作为初始基准,不再new纯Object实例 Object min = a[0]; for (int i=1; i<a.length; i++) { // 修正:比较结果小于0说明当前元素更小,替换基准值,匹配找最小值逻辑 if (c.compare(a[i], min) < 0) { min = a[i]; } } return min; } public static void main(String[] args) { Corso c= new Corso(5); System.out.println(Arrays.toString(c.studenti)); System.out.println("Il reddito minimo è: " + c.minimo(c.studenti, new redComp())); } } class redComp implements Comparator<Studente> { // 优化:用泛型指定比较类型,不需要强转Object @Override public int compare(Studente o1, Studente o2) { return o1.reddito - o2.reddito; } }
运行结果验证
修复后代码运行不会抛出类型转换异常,输出结果如下:
[matricola: 0, reddito: 0, eta: 0, matricola: 1, reddito: 10, eta: 2, matricola: 2, reddito: 20, eta: 4, matricola: 3, reddito: 30, eta: 6, matricola: 4, reddito: 40, eta: 8] Il reddito minimo è: matricola: 0, reddito: 0, eta: 0
内容的提问来源于stack exchange,提问作者Dechny Lamtra
相关产品推荐
相关产品推荐

