为什么标准java类的clone()返回Object而不是实际类型

Ria*_*iaD 16 java

java中允许指定函数返回的类型,例如代码后面

public class Test {

    static class Dad {
        Dad me() {
            return this;
        }
    }

    static class Son extends Dad {
        Son me() {
            return this;
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

已验证.

我们来看ArrayList课.它具有重写clone()功能(至少我在Oracle jdk 1.7源代码中看到它)

public Object clone() {
    try {
        @SuppressWarnings("unchecked")
            ArrayList<E> v = (ArrayList<E>) super.clone();
        v.elementData = Arrays.copyOf(elementData, size);
        v.modCount = 0;
        return v;
    } catch (CloneNotSupportedException e) {
        // this shouldn't happen, since we are Cloneable
        throw new InternalError();
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么不回报ArrayList<E>但只是Object

mer*_*ike 11

向后兼容性.

在Java 5之前,在覆盖时无法缩小返回类型,因此ArrayList.clone()声明返回Object.现在语言允许,他们不能使用它,因为缩小返回类型ArrayList.clone()会破坏ArrayList.clone()使用返回类型覆盖的ArrayList的现有子类Object.


Ste*_*n C 9

一个原因是向后兼容性.Object.clone()当不支持协变返回类型时,方法的签名在Java 1.0中被指定.如果他们按照您的建议更改了这个基本方法,它可能会破坏数千个遗留程序,其中该clone()方法可能不会返回具有相同类型的对象this.

也可以看看: