接收可比对象 [] 时找不到 compareTo

Cannot find compareTo when receiving comparable Object[]

问题是该方法不确定 a 和 b 是否具有可比性,因此编译器抛出一个无法找到 compareTo 的符号。

public class Merge {
    public ArrayList<Object> sorted(Object[] a, Object[] b) {

        int i, j, k;
        i = j = k = 0;
        ArrayList<Object> c = new ArrayList<>();
        while (i < a.length || j < b.length) {
            if (i == a.length) {
                for (j = j; j < b.length; j++) {
                    c.add(k, b[j]);
                    k++;
                }
                break;
            }
            else if (j == b.length) {
                for (i = i; i < a.length; i++) {
                    c.add(k, a[i]);
                    k++;
                }
                break;
            }
            else {
                if ( a[i].equals(b[j]) || a[i].compareTo(b[j]) < 0 ) {
                    c.add(k, a[i]);
                    i++;
                    k++;
                }
                else {
                    c.add(k, b[j]);
                    j++;
                    k++;
                }
            }
        }
        return c;
    }
}

该代码在与 Integer 一起使用时有效。我希望能够使用,例如,sorted(a, b)a = Person[]b = Person[]。当然,在 Person.

中使用方法 compareTo 和 equals

我是否应该在此 class 中实现并扩展与 ObjectType 的可比性并覆盖 compareTo?

我建议你把签名改成

public static <T extends Comparable<T>> List<T> sorted(T[] a, T[] b)

您将能够比较 a[i].compareTo(b[i]) 和 return 适当类型的列表。

要在对象上调用 compareTo(),class 必须实现 Comparable 接口并覆盖 compareTo() 方法。由于Objectclass没有实现Comparable,上面的代码总是会报错

如果只想传递 Person 对象,则需要更改签名以接受 Person[] 数组。如果不是,则需要覆盖 toString() 方法(具有有意义的实现)并将 a[i].compareTo(b[j]) 更改为 a[i].toString().compareTo(b[j].toString()).