我试图在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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。