【发布时间】:2016-11-19 22:42:21
【问题描述】:
为什么我不能克隆ConcurrentHashMap?
ConcurrentHashMap<String, String> test = new ConcurrentHashMap<String, String>();
test.put("hello", "Salaam");
ConcurrentHashMap<String, String> test2 = (ConcurrentHashMap<String, String> ) test.clone();
System.out.println(test2.get("hello"));
如果我使用HashMap 而不是ConcurrentHashMap,它可以工作。
【问题讨论】:
-
因为与
HashMap不同,ConcurrentHashMap没有实现Cloneable。突出的事实是,您的代码无法编译,即该方法不可用!!! -
@Andreas:尽管有这个名字,实现
Cloneable并不意味着你支持clone,支持clone并不要求你实现Cloneable。Cloneable实际上并没有clone作为公共方法。这是clone设计的奇怪缺陷之一。 -
支持
clone确实需要实现Cloneable接口@user2357112。 “在未实现 Cloneable 接口的实例上调用 Object 的 clone 方法会导致抛出异常 CloneNotSupportedException。” - docs.oracle.com/javase/8/docs/api/java/lang/Cloneable.html -
@LewBloch:是的,但是如果你在你的
clone实现中不使用Object::clone(这有时是合理的),你就不需要实现Cloneable。它甚至不像Comparable,如果你实现compareTo而不实现Comparable,你就会失去所有采用Comparable参数的库方法。没有使用clone的内容需要Cloneable,因为你不能clone和Cloneable。
标签: java clone concurrenthashmap