在Arrays.sort(...)中使用转换后的List的ClassCastException

时间:2013-05-20 18:54:45

标签: java

当我使用带有比较器的Arrays.sort()和作为集合的列表(之前转换为数组)时,我得到了一个类强制转换异常。这是我的代码:

List<SomeClazz> somes = new ArrayList<SomeClazz>();
Comparator<SomeClazz> attrComparator = new AttrComparator();

somes = createSomeObjectes(); // returnes a list of course

// this is line 25 where the exception occours
Arrays.sort((SomeClazz[])somes.toArray(), attrComparator);

例外消息:

Exception in thread "main" java.lang.ClassCastException:
    [Ljava.lang.Object; cannot be 
    cast to [Lpack.SomeClazz; at pack.TestMain.main(TestMain.java:25)

这可能是什么原因?提前thx!

2 个答案:

答案 0 :(得分:5)

(SomeClazz[])somes.toArray()

应该是

somes.toArray(new SomeClazz[somes.size()])

您无法将Object[]强制转换为SomeClazz[],但这是将集合转储为您选择的数组类型的“已批准”方式。

答案 1 :(得分:1)

根据List.toArray

的javadoc
  

Object [] java.util.List.toArray()

     

返回一个包含此列表中所有元素的数组   序列(从第一个元素到最后一个元素)。

     

返回的数组将是“安全的”,因为没有对它的引用   由此列表维护。 (换句话说,这种方法必须分配一个   新数组,即使此列表由数组支持)。因此呼叫者   可以自由修改返回的数组。

     

此方法充当基于阵列和基于集合的桥梁   的API。

而是使用List.toArray(T[] arr)

<T> T[] toArray(T[] a);

具体是:

Arrays.sort(somes.toArray(new SomeClazz[]{}), attrComparator);