【问题标题】:Override the clone() method in generic SinglyLinkedList class覆盖泛型 SinglyLinkedList 类中的 clone() 方法
【发布时间】:2015-06-24 09:48:39
【问题描述】:

覆盖克隆方法

当我尝试覆盖通用 SinglyLinkedList 类中的 clone() 方法以获取深度克隆时,我遇到了以下代码。事实上,我对代码有点困惑。 如下图:

 public SinglyLinkedList<E> clone() throws CloneNotSupportedException {
    // use inherited Object.clone() to create the initial copy
    SinglyLinkedList<E> other = (SinglyLinkedList<E>) super.clone( ); // safe cast
    if (size > 0) {
        // we need independent chain of nodes
        other.head = new Node<>(head.getElement( ), null);//Seems something wrong.
        
        Node<E> walk = head.getNext( ); // walk through remainder of original list
        Node<E> otherTail = other.head; // remember most recently created node
        while (walk != null) {
            // make a new node storing same element
            Node<E> newest = new Node<>(walk.getElement( ), null);//So as this one 
            
            otherTail.setNext(newest);
            // link previous node to this one
            otherTail = newest;
            walk = walk.getNext( );
        }
    }
    return other;
}

元素的定义:

E element;
public E getElement() {
  return element;
}

因为它是泛型类型,这意味着 getElement() 可能返回一个对象,所以,我的问题是代码是否应该重写为:

Node<E> newest = new Node<>(walk.getElement().clone(), null);

是否可能存在 CloneNotSupportedException?我是Java新手~ 提前致谢!

【问题讨论】:

  • 这两行是一样的...应该是一样的吗?
  • Kent Pitman(ANSI Common Lisp 标准的编辑之一)写了一篇关于这个主题的short essay(虽然是从 Lisp 的角度来看,但这里的概念也适用)。阅读标题“复制”部分。列表类的作者做出了(有点)武断的决定;我碰巧同意这里的决定,但它仍然是任意的。另外:默认情况下,对象是不可克隆的,所以什么都没有,通用容器可以调用来克隆对象,除非类型参数E 以某种方式限制为提供此功能的类

标签: java generics linked-list clone adt


【解决方案1】:

不太清楚你在问什么 - 因为答案似乎太明显了。

发布的代码克隆了结构,但没有克隆结构中的对象。如果您也想克隆对象,则必须将所有 getElement() 调用替换为 getElement().clone()

【讨论】:

  • 目的是制作深拷贝而不是卷影拷贝。其实我是从DataStructure and Algorithm in java这本书里得到的代码,所以我只是有点cionfused。
  • @shady - 该样本正在执行浅克隆。正如我所建议的,深度克隆也应该克隆所有元素。 ...因此,我们在代码的第 5 行创建一个新的头节点,然后遍历原始列表的其余部分(第 8-13 行),同时为新列表创建和链接新节点。 这是一个浅克隆,它只是创建新节点。
猜你喜欢
  • 2013-08-20
  • 2020-03-14
  • 1970-01-01
  • 2012-03-01
  • 2013-04-04
  • 2016-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多