2015-04-01 73 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