Since Java 5 we are allowed to have covariant return types. Why doesn't the Java API take advantage of this?
Take Graphics2D.create()
for instance. Why isn't it overridden to return a Graphics2D
object? It seems to me that it would be backward compatible in all situations.
The covariant return types are newly introduced since Java 5.0, and used during method overriding. Covariant return type allows us to change the return type of the overriding method in the subclass; however this return type in subclass method must be a subtype of super class method return type.
Covariant return type refers to return type of an overriding method. It allows to narrow down return type of an overridden method without any need to cast the type or check the return type. Covariant return type works only for non-primitive return types.
The overriding method was said to be invariant with respect to return type. Java version 5.0 onwards it is possible to have different return types for an overriding method in the child class, but the child's return type should be a subtype of the parent's return type.
Yes. It is possible for overridden methods to have different return type .
In general, this is indeed in order to maintain backward compatibility. Note that the compatibility must be kept on the bytecode level too, and changing the return type changes the bytecode. So in general, if there are any subclasses which may have overridden the method in question, switching to a covariant return type would break those classes.
Since Graphics2D
is abstract, it is obviously meant to be subclassed, so the above reasoning applies.
Java Generics and Collections, although focuses more on the generics point of view, contains a discussion on covariant overriding in section 8.4.
That would break binary compatibility. Previously compiled classes cannot find the method with the new return type. JLS3 §13.4.15, §13.4.12
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With