收到可比较的Object []时找不到compareTo

时间:2016-03-02 23:33:29

标签: java compareto

问题是方法不确定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等方法。

我是否应该在此类中实现和扩展与ObjectType相当并覆盖compareTo?

2 个答案:

答案 0 :(得分:2)

我建议您将签名更改为

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

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

答案 1 :(得分:0)

要在对象上调用compareTo(),类必须实现Comparable接口并覆盖compareTo()方法。由于Object类没有实现Comparable,上面的代码总是会给你编译错误。

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