为什么Java 5+ API不利用协变返回类型?

时间:2010-09-20 11:48:57

标签: java return-type covariant

从Java 5开始,我们可以拥有covariant return types。为什么Java API没有利用这个?

Graphics2D.create()为例。为什么不重写返回Graphics2D对象?在我看来,它在所有情况下都是向后兼容的。

2 个答案:

答案 0 :(得分:12)

一般来说,这确实是为了保持向后兼容性。请注意,兼容性也必须保持在字节码级别,并且更改返回类型会更改字节码。所以一般来说,如果有任何子类可能覆盖了有问题的方法,切换到协变返回类型会破坏这些类。

由于Graphics2D是抽象的,显然它是子类,因此上述推理适用。

Java Generics and Collections虽然更多地侧重于泛型的观点,但在8.4节中讨论了协变覆盖。

答案 1 :(得分:4)

这会打破二进制兼容性。以前编译的类无法找到具有新返回类型的方法。 JLS3§13.4.15,§13.4.12