2013-05-20 128 views
0

當我使用Arrays.sort()有一個比較器和一個列表作爲一個集合,被預先轉換爲一個數組,我得到一個類轉換異常使用轉換表。這是我的代碼:拋出ClassCastException在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提前!

+4

'比較'和'名單'。錯字或潛伏的'ClassCastException'? –

+0

錯字,沒有看到,sry – Blizzer

+1

爲什麼你不使用'Collections.sort(somes,attrComparator);'? – jlordo

回答

5
(SomeClazz[])somes.toArray() 

應該

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

你不能施放的Object[]SomeClazz[],但這是「批准」的方式來轉儲到集合數組類型的選擇。

+1

或'somes.toArray(new SomeClazz [0])'。 – Dukeling

+0

非常感謝你;-)工作正常! – Blizzer

1

作爲每List.toArray

對象的Javadoc [] java.util.List.toArray()

返回包含的所有元素的此列表中正確 序列的陣列(從第一到最後一個元素)。

返回的數組將是「安全」的,因爲沒有引用它是由此列表維護的 。 (換句話說,即使列表由數組支持,該方法也必須分配 新數組)。因此調用者可以免費修改返回的數組。

此方法充當基於陣列和基於集合的 API之間的橋樑。

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

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

明確:

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