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

时间:2013-07-07 05:52:51

标签: java

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

public class Test {

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

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

有效。

让我们看看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();
    }
}

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

2 个答案:

答案 0 :(得分:11)

向后兼容性。

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

答案 1 :(得分:9)

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

另见: