使用Arrays.sort(Object []时)的java.lang.ClassCastException

时间:2015-03-24 15:48:46

标签: java

以下是我的代码段

package arrays.sort;

import java.util.Arrays;

public class ArraySortExample {

    public static void main(String[] args) {
        Object[] myObjects = {
                new Integer(12),
                new String("foo"),
                new Integer(5),
                new Boolean("true"),
        };

        Arrays.sort(myObjects);

        for(int i = 0 ; i < myObjects.length;i++){
            System.out.println(myObjects[i].toString());
            System.out.println("");
        }
    }
}

我收到以下异常。

Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
    at java.lang.Integer.compareTo(Unknown Source)
    at java.util.Arrays.mergeSort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at arrays.sort.ArraySortExample.main(ArraySortExample.java:15)

可能是什么原因?

2 个答案:

答案 0 :(得分:4)

首先,all Objects in that array must implement the Comparable interface,他们,但他们自己无法相互比较。

来自文档:

  

此外,数组中的所有元素必须具有可比性(即e1.compareTo(e2)不得为数组中的任何元素ClassCastExceptione1抛出e2

IntegerStringBoolean之间没有符合Arrays.sort的自然顺序,因此上述期望失败。

考虑一下你又在做什么 - 你为什么需要使用数组?情况可能是List<? extends Comparable<?>>可能更适合您的需求。

答案 1 :(得分:1)

正如其他人已经说过的那样,您的数组中的对象无法使用compareTo()中的Comparable方法进行比较,但是,您仍然可以使用comparator进行排序只要您有明确定义的排序方式IntegerString

以下示例首先根据类名对对象进行排序,如果它们是同一个类,则使用compareTo()

Arrays.sort(myObjects, new Comparator<Object>(){
    @Override
    public int compare(Object o1, Object o2)
    {
        String o1Class = o1.getClass().getCanonicalName();
        String o2Class = o2.getClass().getCanonicalName();
        int ret = o1Class.compareTo(o2Class);

        if (ret == 0) // Classes are the same
        {
            // Not type safe but it's only an example
            ret = ((Comparable)o1).compareTo(o2);
        }
        return ret;
    }
});

它很难看,但它可以提供数组中的所有对象实现Comparable。实际上,我永远不会这样做,我考虑采用Makoto的答案。