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.
一个原因是向后兼容性.Object.clone()当不支持协变返回类型时,方法的签名在Java 1.0中被指定.如果他们按照您的建议更改了这个基本方法,它可能会破坏数千个遗留程序,其中该clone()方法可能不会返回具有相同类型的对象this.
也可以看看:
| 归档时间: |
|
| 查看次数: |
2241 次 |
| 最近记录: |