编程语言
首页 > 编程语言> > java – 在LinkedList上实现克隆

java – 在LinkedList上实现克隆

作者:互联网

我试图在DoubleLinkedList上实现clone()方法.现在,问题是通过“约定”实现它比创建一个新的DoubleLinkedList并用我当前的DoubleLinkedList的所有元素填充它要麻烦得多.

这样做有什么不方便吗?

这是我目前的做法:

@Override
public DoubleLinkedList<T> clone() {
    DoubleLinkedList<T> dll = new DoubleLinkedList<T>();

    for (T element : dll) {
        dll.add(element);
    }

    return dll;
}

以下是大会的内容:

@Override
public DoubleLinkedList<T> clone() {
    try {
        DoubleLinkedList<T> dll = (DoubleLinkedList<T>)super.clone();
        //kinda complex code to copy elements
        return dll;
    } catch (CloneNotSupportedException e) {
        throw new InternalError(e.toString());
    }
}

解决方法:

正如您正确指出的那样,约定是在clone()的实现开始时始终调用super.clone().从API docs on Object#clone()

By convention, the returned object should be obtained by calling super.clone. If a class and all of its superclasses (except Object) obey this convention, it will be the case that x.clone().getClass() == x.getClass().

您的第一次尝试(不使用super.clone())具有以下问题:

假设我有

class IntDoubleLinkedList extends DoubleLinkedList<Integer> implements Cloneable

(并且IntDoubleLinkedList不打扰覆盖clone())并运行以下代码:

IntDoubleLinkedList idll = new IntDoubleLinkedList();
IntDoubleLinkedList idll2 = (IntDoubleLinkedList) idll.clone();

会发生什么?将执行DoubleLinkedList的clone方法,如果它不通过super.clone(),则返回DoubleLinkedList的实例,而DoubleLinkedList又不能转换为IntDoubleLinkedList.将抛出ClassCastException!

那么super.clone()如何解决这个问题呢?好吧,如果每个人都坚持在重写克隆方法中调用super.clone()的约定,最终将调用Object.clone(),并且此实现将创建一个正确类型的实例(在本例中为IntDoubleLinkedList)!

标签:java,cloneable,cloning
来源: https://codeday.me/bug/20190606/1190661.html