Java 5+ API为什么不利用协变返回类型?
问题描述:
自Java 5以来,我们被允许拥有covariant return types。为什么Java API不利用这一点?Java 5+ API为什么不利用协变返回类型?
以Graphics2D.create()
为例。为什么不重写返回一个Graphics2D
对象?在我看来,它会在所有情况下向后兼容。
答
一般来说,这确实是为了保持向后兼容性。请注意,兼容性也必须保持在字节码级别,并且更改返回类型会更改字节码。因此,一般来说,如果有任何可能覆盖相关方法的子类,切换到协变返回类型将会破坏这些类。
由于Graphics2D
是抽象的,它显然意味着被分类,所以上述推理适用。
Java Generics and Collections,尽管更多地关注泛型的观点,但在8.4节中讨论了协变覆盖。
答
这会破坏二进制兼容性。先前编译的类无法找到具有新返回类型的方法。 JLS3§13.4.15,§13.4.12