从 Java 5 开始,我们可以使用协变返回类型。为什么 Java API 不利用这一点?
举个Graphics2D.create()
例子。为什么不重写它以返回一个Graphics2D
对象?在我看来,它在所有情况下都是向后兼容的。
从 Java 5 开始,我们可以使用协变返回类型。为什么 Java API 不利用这一点?
举个Graphics2D.create()
例子。为什么不重写它以返回一个Graphics2D
对象?在我看来,它在所有情况下都是向后兼容的。
一般来说,这确实是为了保持向后兼容性。请注意,兼容性也必须保持在字节码级别,并且更改返回类型会更改字节码。所以一般来说,如果有任何子类可能覆盖了相关方法,切换到协变返回类型会破坏这些类。
由于Graphics2D
是抽象的,它显然意味着要被子类化,所以上述推理适用。
Java 泛型和集合虽然更多地关注泛型的观点,但在第 8.4 节中包含了关于协变覆盖的讨论。
那会破坏二进制兼容性。以前编译的类找不到具有新返回类型的方法。JLS3 §13.4.15、§13.4.12