Java FAQ:オブジェクトのコピー

Java FAQ:S027 Q-02

  • さらっと「Object#clone() メソッドを使用します」と書いてあったが、Ruby の感覚では使えなかった…
  • java.util.* あたりのコレクションクラスだと単純に呼び出せそうな感じ
public class C2008062900 {
    public static void main(String[] args) {
        Object o1 = new Object();
        Object o2 = o1.clone();

        System.out.println(o1);
        System.out.println(o2);
    }
}

で、

C2008062900.java:5: clone() は java.lang.Object で protected アクセスされます。
        Object o2 = o1.clone();
                      ^
エラー 1 個


String なら?

public class C2008062901 {
    public static void main(String[] args) {
        String s1 = "foo";
        String s2 = s1.clone();

        System.out.println(s1);
        System.out.println(s2);
    }
}

で、

C2008062901.java:5: clone() は java.lang.Object で protected アクセスされます。
        String s2 = s1.clone();
                      ^
C2008062901.java:5: 互換性のない型
出現: java.lang.Object
要求: java.lang.String
        String s2 = s1.clone();
                            ^
エラー 2 個
class C2008062903 implements Cloneable {
    public C2008062903 dup() {
        try {
            return (C2008062903)this.clone();
        } catch (CloneNotSupportedException e) {
            return null;
        }
    }
}

public class C2008062902 {
    public static void main(String[] args) {
        C2008062903 o1 = new C2008062903();
        C2008062903 o2 = o1.dup();

        System.out.println(o1);
        System.out.println(o2);

        System.out.println(o1 == o2);
    }
}

で、

C2008062903@82f0db
C2008062903@f6a746
false
import java.util.*;

public class C2008062904 {
    public static void main(String[] args) {
        LinkedList o1 = new LinkedList();
        LinkedList o2 = (LinkedList)o1.clone();

        System.out.println(o1);
        System.out.println(o2);

        System.out.println(o1 == o2);
    }
}

で、

[]
[]
false

なんで、キャストが必要なん(Object が返ってくるん)だろう?