当我使用带有比较器的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!
答案 0 :(得分:5)
(SomeClazz[])somes.toArray()
应该是
somes.toArray(new SomeClazz[somes.size()])
您无法将Object[]
强制转换为SomeClazz[]
,但这是将集合转储为您选择的数组类型的“已批准”方式。
答案 1 :(得分:1)
根据List.toArray
Object [] java.util.List.toArray()
返回一个包含此列表中所有元素的数组 序列(从第一个元素到最后一个元素)。
返回的数组将是“安全的”,因为没有对它的引用 由此列表维护。 (换句话说,这种方法必须分配一个 新数组,即使此列表由数组支持)。因此呼叫者 可以自由修改返回的数组。
此方法充当基于阵列和基于集合的桥梁 的API。
而是使用List.toArray(T[] arr)
<T> T[] toArray(T[] a);
具体是:
Arrays.sort(somes.toArray(new SomeClazz[]{}), attrComparator);