自Java 5以來,我們被允許擁有covariant return types。爲什麼Java API不利用這一點?Java 5+ API爲什麼不利用協變返回類型?
以Graphics2D.create()
爲例。爲什麼不重寫返回一個Graphics2D
對象?在我看來,它會在所有情況下向後兼容。
自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