0

我需要知道如何循环遍历哈希表,检查每个值的可克隆性,并在可能的情况下进行克隆。此 Hashtable 具有所有 String 键,但值可以是任何类。我在另一个 Stack Overflow 页面上遇到了以下 Hashmap 示例,但我需要使用 Hashtable 来执行此操作。更具体地说,一个不带括号的。(哈希表而不是Hashtable<Type, Type>。)我还看到了循环遍历 ArrayList 并克隆每个元素的示例,但我需要使用哈希表来执行此操作。我在下面发布了两段代码:第一段是我找到的 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;
    }
}

此代码不会编译。该错误表示克隆方法在对象类上,并且该类上的方法受到保护。我需要它来克隆当前值的类,但由于我作为程序员不知道那个类,我不知道如何将它转换为正确的类。

非常感谢围绕这个障碍的任何见解和帮助。

4

1 回答 1

1

clone()方法受到精确保护,以防止您克隆任意对象,这通常表明您正在尝试做一些奇怪的事情。

Cloneable不包含有点不方便clone()。请参阅为什么在 java.lang.Object 中保护 clone() 方法?就此事进行一些讨论。

另请参阅https://stackoverflow.com/a/10083129/616460上的答案,以获得关于一般问题的一些好的指示clone()

无论如何,如果你必须这样做......

一种选择可能是定义一个接口,将对象标记为可以为您的哈希表复制,并提供clone(),例如:

public interface Copiable extends Cloneable {
    public Object clone ();
}

第二种选择是创建一些接口,该接口提供一种方法来制作对象的深层副本,并让您的类实现它,例如:

public interface Copiable {
    public Copiable createDeepCopy ();
}

如果您不顾一切,另一种选择是使用反射来调用clone()对象Cloneable。不过,您可能希望三思而后行。

于 2013-11-04T05:43:32.247 回答