20

在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

4

2 回答 2

15

向后兼容性。

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

于 2013-07-07T06:00:10.777 回答
11

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

也可以看看:

于 2013-07-07T05:57:06.843 回答