我需要知道如何循环访问Hashtable,检查每个值的可克隆性,并在可能的情况下进行克隆。此Hashtable具有所有String键,但值可以是任何类。我在另一个Stack Overflow页面上遇到了以下Hashmap示例,但我需要使用Hashtable执行此操作。更具体地说,一个没有括号。 (Hashtable而不是Hashtable<Type, Type>
。)我还看到了循环遍历ArrayList并克隆每个元素的示例,但我需要使用哈希表来执行此操作。我在下面发布了两段代码:第一部分是我找到的HashMap示例,第二部分是我当前的提案以及我遇到的问题。
HashMap
public Map<String,C> deepCopy(Map<String, C> original) {
Map<String, C> copy = new HashMap<String, C>(original.size());
for(Map.Entry<String, C> entry : original.entries()) {
copy.put(entry.getKey(), entry.getValue().clone());
}
}
我的建议
public class _HashtableCloningTest {
public Hashtable deepClone(Hashtable original) {
Hashtable newH = new Hashtable(original.size())
Set<String> keys = original.keySet();
for (String key : keys)
if (original.get(key) instanceof Cloneable)
newH.put(key, original.get(key).clone());
return newH;
}
}
此代码无法编译。错误说克隆方法在对象类上,并且该类上的方法受到保护。我需要它来克隆当前值的类,但由于我作为程序员不知道该类,我不知道如何将它转换为正确的类。
非常感谢任何有关此障碍的见解和帮助。
答案 0 :(得分:1)
clone()
方法受到严格保护,以防止您克隆任意对象,这通常表明您正在尝试做一些奇怪的事情。
Cloneable
不包含clone()
有点不方便。请参阅Why is the clone() method protected in java.lang.Object?上的答案,了解有关此事的一些讨论。
另请参阅https://stackoverflow.com/a/10083129/616460上的答案,了解一般clone()
问题的一些好的指示。
在任何情况下,如果你有来执行此操作......
一个选项可能是定义一个接口,将对象标记为可以为哈希表复制,并提供clone()
,例如:
public interface Copiable extends Cloneable {
public Object clone ();
}
第二个选项是创建一个接口,该接口提供一个方法来制作一个对象的深层副本,并让你的类实现它,例如:
public interface Copiable {
public Copiable createDeepCopy ();
}
如果你绝望的另一个选择是使用反射来调用clone()
对象上的Cloneable
。不过,您可能希望三思而后行。