使用泛型实现归并排序时遇类型转换错误的技术咨询
泛型归并排序的错误修正
问题根源
你的代码里有三个明显错误,直接导致编译器提示“E[]无法转换为int”:
- 变量类型错配:第11行你把本该是长度值的
secondHalfLength定义成了E[]数组类型,它本质是个整数,用来表示后半部分数组的长度。 - 数组创建语法错误:第12行
E[] secondHalf = new [secondHalfLength];完全不符合Java语法,而且你试图用数组对象当长度参数,这就触发了类型转换错误。 - System.arraycopy参数错误:第13行最后一个参数要求是int类型的长度,但你传了数组对象,自然类型不兼容。
修正后的完整代码
package holdClasses; public class sortMethods<E> { public static <E extends Comparable<E>> void mergeSort(E[] list) { if (list.length > 1) { // 拆分前半部分 E[] firstHalf = (E[]) new Object[list.length / 2]; System.arraycopy(list, 0, firstHalf, 0, list.length / 2); mergeSort(firstHalf); // 修正后半部分的处理逻辑 int secondHalfLength = list.length - list.length / 2; E[] secondHalf = (E[]) new Object[secondHalfLength]; System.arraycopy(list, list.length / 2, secondHalf, 0, secondHalfLength); mergeSort(secondHalf); // 补充归并排序必需的合并步骤 merge(firstHalf, secondHalf, list); } } // 实现合并两个有序数组的逻辑 private static <E extends Comparable<E>> void merge(E[] firstHalf, E[] secondHalf, E[] result) { int i = 0, j = 0, k = 0; // 逐个比较两个子数组的元素,按顺序放入结果数组 while (i < firstHalf.length && j < secondHalf.length) { if (firstHalf[i].compareTo(secondHalf[j]) <= 0) { result[k++] = firstHalf[i++]; } else { result[k++] = secondHalf[j++]; } } // 处理前半数组剩余元素 while (i < firstHalf.length) { result[k++] = firstHalf[i++]; } // 处理后半数组剩余元素 while (j < secondHalf.length) { result[k++] = secondHalf[j++]; } } }
关键修正说明
- 把
secondHalfLength改为int类型,正确存储后半部分数组的长度值。 - 创建
secondHalf数组时,沿用前半部分的方式(E[]) new Object[secondHalfLength],绕过Java无法直接创建泛型数组的限制。 - 修正
System.arraycopy的最后一个参数,传入正确的int类型长度。 - 补充了
merge方法——归并排序的核心就是拆分后合并,原代码只做了拆分,缺少合并步骤会导致排序完全无效。
内容的提问来源于stack exchange,提问作者Regis
相关产品推荐
相关产品推荐

