2011-12-05 45 views
3

我對Java並不陌生,雖然我從來沒有真正與Set s合作過, 所以任何人都可以請我幫忙嗎?雖然類型相同,但我得到一個ClassCastException事件。爲什麼?

我有以下問題; 但首先,這是我的代碼:

HashMap<Position[], String> save = io.getSave(); 

Position[][] saved_pos = (Position[][]) save.keySet().toArray(); 

雖然在第二行,爪哇拋出一個ClassCastException,但是爲什麼呢? 顯然,由save.keySet().toArray()返回的數組確實包含Position[][] s,儘管遺憾的是,類中的toArray()只返回Object[]數組。

那麼我該怎麼做,我需要施展這個。

+1

我有興趣知道你爲什麼使用職位有你的鑰匙。又名爲什麼你要做'HashMap '而不是'HashMap '? – Nix

+0

2維數組的位置是什麼意思[] []? – hovanessyan

+0

@hovanessyan:這意味着一個數組的元素有'Position []'類型。 (換句話說,「鋸齒狀陣列」。) – ruakh

回答

7

toArray()方法實際上並不知道它在一組Position[] s上被調用;所有它知道的是它被調用在一個集合上。 (這是因爲泛型是如何在Java中實現的;在運行時沒有太多的信息可用)。因此,它只返回一個完整的​​s,而不是返回真實的Partition[][]。 (區別在於一個Object[]可以包含任意對象—這將是有效的,你的電話後,寫saved_pos[0] = new Object() —而真正Partition[][]將提高ArrayStoreException如果你試圖設置它的要素之一new Object()。)

幸運的是,可以使用的,在那裏你告訴它,你想要什麼類型的數組,像這樣單獨toArray(...)方法:

Position[][] saved_pos = save.keySet().toArray(new Position[0][]); 
+0

謝謝。正是我所需要的 –

+0

不客氣! – ruakh

0

你需要

Set<Position[]> positions = save.keySet(); 
    Position[][] saved_pos = positions.toArray(new Position[positions.size()][]); 
0
Position[][] saved_pos = save.keySet().toArray(new Position[0][]) 

你需要這個,因爲Java可以不投Object[][]Position[][]

0

默認指定者只是返回你的對象,而不是位置,你必須通過你要指定者返回你的對象類型,

您的代碼將被修改爲

save.keySet().toArray(new Position[][]{}); // Yes a blank Position[][] will do 
相關問題