以下是我的代码段
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)
可能是什么原因?
答案 0 :(得分:4)
首先,all Object
s in that array must implement the Comparable
interface,他们做,但他们自己无法相互比较。
来自文档:
此外,数组中的所有元素必须具有可比性(即
e1.compareTo(e2)
不得为数组中的任何元素ClassCastException
和e1
抛出e2
Integer
,String
和Boolean
之间没有符合Arrays.sort
的自然顺序,因此上述期望失败。
考虑一下你又在做什么 - 你为什么需要使用数组?情况可能是List<? extends Comparable<?>>
可能更适合您的需求。
答案 1 :(得分:1)
正如其他人已经说过的那样,您的数组中的对象无法使用compareTo()
中的Comparable
方法进行比较,但是,您仍然可以使用comparator进行排序只要您有明确定义的排序方式Integer
和String
。
以下示例首先根据类名对对象进行排序,如果它们是同一个类,则使用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的答案。