在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
?
答案 0 :(得分:11)
向后兼容性。
在Java 5之前,覆盖时无法缩小返回类型,因此声明ArrayList.clone()
返回Object
。现在语言允许,他们不能使用它,因为缩小ArrayList.clone()
的返回类型会破坏覆盖ArrayList.clone()
的返回类型为Object
的ArrayList的现有子类。
答案 1 :(得分:9)
一个原因是向后兼容性。 {* 1}}方法的签名是在Java 1.0中指定的,当时不支持协变返回类型。如果他们按照您的建议更改了这个基本方法,它可能会破坏数千个遗留程序,其中Object.clone()
方法可能不会返回与clone()
类型相同的对象。
另见: