Java中的双重链接列表clone()问题

时间:2014-04-06 18:09:19

标签: java clone doubly-linked-list

我正在尝试创建一个克隆方法和复制构造函数来创建Doubly Linked列表的深层副本,但是我得到了一些我似乎无法弄清楚的编译器错误。特别是在copyOf方法中,我用它来帮助创建深拷贝,用于行:

newHead = new TwoWayNode<T>((T)(position.data).clone(), null, null);

编译器说clone()在Object中具有受保护的访问权限。第二个问题来自这一行:

end.next = new TwoWayNode<T>((T)(position.data).clone(), head, null));

对于此错误,我收到与上面相同的消息,但我也看到应该有一个&#39 ;;&#39;预期,这对我没有意义。任何人都对我可能做错了什么有任何见解?

public DoublyLinkedList(DoublyLinkedList<T> otherList)
{
    if (otherList == null)
        throw new NullPointerException();
    if (otherList.head == null)
        head = null;
    else
        head = copyOf(otherList.head);
}

public DoublyLinkedList<T> clone()
{
    try
    {
        DoublyLinkedList<T> copy = (DoublyLinkedList<T>)super.clone();
        if (head == null)
            copy.head = null;
        else 
            copy.head = copyOf(head);
        return copy;
    }
    catch(CloneNotSupportedException e) //should not happen
    {
        return null;
    }
}

private TwoWayNode<T> copyOf(TwoWayNode<T> otherHead)
{
    TwoWayNode<T> position = otherHead;
    TwoWayNode<T> newHead; 
    TwoWayNode<T> end = null;

    try
    {
        newHead = new TwoWayNode<T>((T)(position.data).clone(), null, null);
        end = newHead;
        position = position.next;
        while (position != null)
        {
            end.next = new TwoWayNode<T>((T)(position.data).clone(), head, null);
            end = end.next;
            position = position.next;
        }
        return newHead;
    }
    catch(CloneNotSupportedException e)
    {
        return null;
    }
}

编辑括号问题已得到纠正,但我仍然无法使用clone()的受保护访问权限。我的演示文件带来错误的部分现在看起来像这样:

    System.out.println("Initializing copy constructor");
    DoublyLinkedList list2 = new DoublyLinkedList(list1);
    DoublyLinkedList.DoublyLinkedIterator j = list2.iterator();
    System.out.println("list2 contains:");

    j.restart();
    while (j.hasNext())
        System.out.println(j.next());
    System.out.println("");

1 个答案:

答案 0 :(得分:0)

您有更多的右括号,因此如果您要删除一个问题,我们会修复;问题。

end.next = new TwoWayNode<T>((T)(position.data).clone(), head, null);

对于另一个,只需替换此行

newHead = new TwoWayNode<T>((T)(position.data).clone(), null, null);

这个。

newHead = new TwoWayNode<T>((T)((T)position.data).clone(), null, null);

这将阻止它访问Object类的clone()方法,并将使用clone()

的类的版本(即由您实现)