2014-12-12 2 views
1

표시되지깊은 복사 방법 클론() 나는이 객체 내 자신의 깊은 복사를 구현하기 위해 노력하고있어

메트로 왜

public Column<T> copy() 
{ 
    ArrayList<T> valuesCopy = new ArrayList<T>(); 

    for (T value : values) 
     valuesCopy.add(value.clone()); // The method clone() from the type Object is not visible 

    return new Column<T>(name, valuesCopy); 
} 

:

Column<String> column  = new Column<String>(); 
// ... 
Column<String> columnCopy = column.copy(); 

이 내가 (방법 클론()가 올바르게 기능 ovverridden라고 가정)를 구현하기 위해 노력하고있어 방법 값 유형이 T extends Cloneable으로 정의 된 T 인 경우 hod clone()이 표시되지 않습니까?

감사합니다.

답변

5

메서드는 다음과 같은 이유로 코드에서 볼 수 없습니다.

  1. cloneprotected in Object입니다.
  2. Cloneable interfacepublicclone 메서드 (또는 모든 메서드)의 존재를 보장하지 않는 마커 인터페이스입니다.
  3. 당신은 상한 Cloneable으로 제네릭 형식 매개 변수 T를 사용하고 있지만, 형식 삭제 후, 이것은 단지 Cloneable된다, 그래서 컴파일러는 Object 방법이 존재 가정 할 수 있으며, clone 보호되고, 그래서이 호출 할 수 없습니다 방법.
1

Cloneable에는 복제본()이 없습니다. 이 인터페이스는 하지가 복제 방법을 포함한다는 것을

참고. 따라서이 인터페이스를 구현한다는 사실만으로 객체를 복제 할 수는 없습니다. 복제 메서드가 반영된 경우에도 이 성공할 것이라고 보장 할 수 없습니다.

1

clone 방법은 다른 사람이 지적한 것처럼 여러 가지 이유로 작동하지 않습니다.

글자 그대로 개체를 반복하고 각 요소를 "복제본"개체의 새 요소에 복사하거나 직접 개체에 deserialize으로 직접 복사하는 방법은 몇 가지가 있습니다. 정확한 사본을 만들 것입니다.

다음은 모든 객체를 취하고 정확한 복제 객체를 반환하는 간단한 예입니다. 예상 유형으로 다시 캐스트해야합니다.

public static Object makeClone(final Object obj) 
          throws IOException, ClassNotFoundException { 

     java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(); 
     java.io.ObjectOutputStream obj_out = new java.io.ObjectOutputStream(bos); 
     obj_out.writeObject(obj); 

     java.io.ByteArrayInputStream bis = 
         new java.io.ByteArrayInputStream(bos.toByteArray()); 
     java.io.ObjectInputStream obj_in = new java.io.ObjectInputStream(bis); 

     @SuppressWarnings("unchecked") 
     Object newObj = obj_in.readObject(); 

     bos.close(); 
     bis.close(); 
     obj_out.close(); 
     obj_in.close(); 

     return newObj; 
} 
0

어 죄송합니다. 나는 Cloneable 인터페이스가 단순한 마커 인터페이스가 아니라고 확신했습니다.

내 솔루션에 대해 어떻게 생각합니까? (나는 그것이 정확한지 확실하지 않다)

public class Column<T extends Copyable<T>> implements Cloneable 
{ 

    private final ArrayList<T> values; 

    private String name; 

    // ... 

    public Column<T> clone() 
    { 
     ArrayList<T> valuesCopy = new ArrayList<T>(); 

     for (T value : values) 
      valuesCopy.add(value.clone()); 

     return new Column<T>(name, valuesCopy); 
    } 

} 

public interface Copyable<T> extends Cloneable 
{ 

    public T clone(); 

} 
+0

만약 그것이 확실하지 않다면; 먼저 시도해보고 게시하십시오. – Charlie

+0

분명히 게시하기 전에 시도하고 작동합니다. 나는 그것이 좋은 연습인지 아직도 확실하지 않다. – BlackBrain

+0

'Column '는'Cloneable' 대신'Copyable >'를 구현해야합니다. – acelent