java - 如何循环遍历 Map 并克隆每个值?

标签 java for-loop casting hashtable clone

我需要知道如何 for 循环遍历哈希表,检查每个值的可克隆性,并在可能的情况下进行克隆。该哈希表具有所有字符串键,但值可以属于任何类。我在另一个 Stack Overflow 页面上遇到了以下 Hashmap 示例,但我需要使用 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;
    }
}

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

非常感谢任何解决此障碍的见解和帮助。

最佳答案

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

Cloneable 不包含 clone() 有点不方便。答案见Why is the clone() method protected in java.lang.Object?对这个问题进行一些讨论。

另请参阅 https://stackoverflow.com/a/10083129/616460 的答案关于 clone() 一般问题的一些好的建议。

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

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

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

第二个选择是创建一些接口(interface),提供一种方法来制作对象的深拷贝,并让您的类实现该方法,例如:

public interface Copiable {
    public Copiable createDeepCopy ();
}

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

关于java - 如何循环遍历 Map 并克隆每个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19762254/

相关文章:

java - Java 5“Executor”的正确发音是什么?

java - 创建 JFrame 时创建对象是一个好习惯吗

php - 循环遍历动态输入框并插入mysql数据库

java - 为什么我的第二个阵列没有被完全打印出来?

java - (Java) 遍历一个 Vector<String[]>,为什么 .next() 是一个对象,而不是一个 String[]?

java - 在 Android Studio 的 Java 中解析 JSON 的问题

java - 从 Spring Controller 加载 CSS

r - 如何避免矩阵计算中的双for循环

将 void* 转换为其他类型

winapi - 了解 : conversion from long_ptr to bool possible loss of data