2015-04-01 76 views
2

我編碼一些Java代碼,我看到,我可以這樣做:Object的LinkedList和HashMap的LinkedList的區別?

LinkedList<HashMap<String,Object>> errorManagement = new LinkedList<HashMap<String, Object>>(); 
HashMap<String,Object> i = new HashMap<String,Object>(); 
errorManagement.add(i.clone()); <-- impossible to add the hash map here 

我在那裏得到了一些錯誤,如果我想一個哈希表添加到我的鏈接列表...

而且我想通了,做那樣:

HashMap<String,Object> tokenInfo = new HashMap<String,Object>(); 
LinkedList<Object> errorManagement = new LinkedList<Object>(); 
errorManagement.add(tokenInfo.clone()); <-- everything working like a charm ! 

我沒有任何更多的錯誤。 有人可以解釋我爲什麼嗎?有什麼區別?

P.S. :在有人問我之前,我應該說,當我將任何東西添加到鏈接列表時(第一個示例),都會拋出錯誤!

+1

你檢查'clone'已經返回類型? – 2015-04-01 14:43:30

+0

如果您粘貼了異常堆棧跟蹤將會很有幫助。另外:你可以寫'HashMap i = new HashMap <>();'......不需要重複類型信息。 – GhostCat 2015-04-01 14:44:07

+1

@EddyG這是一個編譯器錯誤。 – 2015-04-01 14:44:25

回答

4

問題是返回類型clone():它是Object,而不是HashMap<String,Object>。這就是爲什麼第二個片段有效,但第一個沒有。

errorManagement.add(new HashMap<String,Object>(i)); 
+0

謝謝你的信息! :) – Damiii 2015-04-01 14:50:28

1

對象是在默認情況下每個類的父,因此HashMap的是Object類型的,因此你將能夠:

你可以通過構造函數構造哈希表的副本將第一代碼片段添加Object的孩子即HashMap。

另一件事是克隆返回類型是Object,因此即使您將它轉換回HashMap,您也應該能夠做到這一點。

所以,如果你想擺脫錯誤的,那麼你應該改變

errorManagement.add(i.clone()); 

errorManagement.add((HashMap)i.clone()); 
+0

謝謝你的信息! :) – Damiii 2015-04-01 14:50:31