Java泛型quickSort方法调用Circle对象数组运行报错如何解决?
你遇到的问题核心原因是:你定义的quickSort方法对传入的数组元素类型有强制泛型约束<T extends Comparable<? super T>>,要求数组元素必须实现Comparable接口,才能调用内置比较逻辑完成排序。
之前quickSort(a, 0, a.length - 1)可以正常运行,是因为数组a的元素类型是Java内置的Integer、String等类,这些类已经默认实现了Comparable接口,符合泛型约束。而你自定义的Circle类没有实现Comparable接口,所以传入Circle数组c时会触发类型不匹配报错。
以下是两种可行的解决方法:
方案1:修改Circle类实现Comparable接口(推荐)
如果你需要给Circle类定义默认排序规则,直接让Circle类实现Comparable接口,重写compareTo方法定义排序逻辑即可。示例代码如下:
// 给Circle的泛型T增加可比较约束,同时实现Comparable接口 class Circle<T extends Comparable<? super T>> implements Comparable<Circle<T>> { T obj; Circle(T obj) { this.obj = obj; } // 构造方法 public T getObject() { return this.obj; } // 重写比较方法,按你需要的排序规则实现即可,以下是按存储的obj属性大小排序的示例 @Override public int compareTo(Circle<T> otherCircle) { if (otherCircle == null) { return 1; } return this.obj.compareTo(otherCircle.obj); } }
方案2:重载quickSort方法支持自定义比较器
如果你不想修改Circle类的定义,可以新增一个支持传入Comparator的quickSort重载方法,绕过元素必须实现Comparable的约束。
首先修改快排相关方法,增加Comparator参数:
static <T> void quickSort(T[] a, int p, int r, Comparator<? super T> comparator){ if (p < r){ int q = partition(a,p,r, comparator); quickSort(a,p,q-1, comparator); quickSort(a,q+1,r, comparator); } } // 对应的partition方法也要修改,使用传入的comparator做比较 static <T> int partition(T[] a, int p, int r, Comparator<? super T> comparator) { T pivot = a[r]; int i = p - 1; for (int j = p; j < r; j++) { if (comparator.compare(a[j], pivot) <= 0) { i++; T temp = a[i]; a[i] = a[j]; a[j] = temp; } } T temp = a[i+1]; a[i+1] = a[r]; a[r] = temp; return i + 1; }
调用的时候传入自定义的比较规则即可,示例:
// 假设Circle存储的是Integer类型,按obj的大小升序排序 quickSort(c, 0, c.length - 1, (o1, o2) -> o1.getObject().compareTo(o2.getObject()));
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

