Since Java 5 it is hard to make a very short, yet still true statement about the return type for Overridden methods.
For primitive return types it must still match precisely, if I recall correctly.
For reference return types, it may either match precisely or be any known sub-class (the definition of Covariance).
The notion of covariance does not apply to primitive return types in any way:
jshell> class Base { int method() { return 15;} }
| modified class Base
jshell> class Derived extends Base { long method() { return 77;}}
| Error:
| method() in Derived cannot override method() in Base
| return type long is not compatible with int
| class Derived extends Base { long method() { return 77;}}
| ^-------------------------^
jshell> class Derived extends Base { short method() { return Short.valueOf("12");}}
| Error:
| method() in Derived cannot override method() in Base
| return type short is not compatible with int
| class Derived extends Base { short method() { return Short.valueOf("12");}}
| ^-------------------------------------------^
But this of course, as you say, is fine:
jshell> class BaseRefRet { Number method() { return Integer.valueOf(15);} }
| created class BaseRefRet
jshell> class DerivedRefRet extends BaseRefRet { @Override Double method() { return Double.valueOf(3.14159);}}
| created class DerivedRefRet
If I was forced to make a one-sentence statement that included the words "return type" I would be unhappy, but would probably say:
overridden methods share the exact same name, list of parameters, and compatible return type.
Where the meaning of "compatible" would be the somewhat complex stuff shown above.
The question might have been a hold-over from Very Old Java books (it was true as of the Java 1.4 release) or was possibly just a careless statement made in haste.