覆盖克隆方法,但仍受保护

时间:2019-05-08 20:59:54

标签: java clone overwrite

public Object clone() throws CloneNotSupportedException {
DoublyLinkedList<E> other=(DoublyLinkedList<E>) super.clone();
if(size > 0){
  other.header=new Node<>(null,null,null);
  other.trailer=new Node<>(null,other.header,null);
  other.header.setNext(other.trailer);
  Node<E> walk=header.getNext();
  Node<E> otherWalk=other.header;
  while (walk != trailer){
    Node<E> newest=new Node<> 
 (walk.getElement(),otherWalk,otherWalk.getNext());
    otherWalk.setNext(newest);
    walk=walk.getNext();
    otherWalk=otherWalk.getNext();
  }
  }
 return other;
 }

我将克隆方法覆盖为公共方法,并在我的代码中使用了它。

public Object deepCopy() {
Node<E> walk = header;
while (walk != trailer) {
  Node<E> newNode = new Node<E>((E)
          (walk.getElement()).clone(), null, null);
  ......

但是它出现一个错误,提示“ clone()在java.lang.Object中具有受保护的访问”。

在我的课堂上,我已经将clone方法更改为public方法,为什么它仍然受到保护?

1 个答案:

答案 0 :(得分:0)

当您尝试像以前那样调用克隆方法时:

(E)(walk.getElement()).clone()

它尝试调用clone类中定义的Object方法,然后尝试将克隆转换为E类型。但这失败了,因为Object#clone方法具有受保护的范围。

要调用覆盖的clone方法,您必须这样编写:

(E)((E)(walk.getElement().clone()))