Best practice – use @Override on the overriding method to request “approval” by the compiler. You will realize that
Rule 1: “return type of the overriding method can (but not c++ ) be a subclass of the return type of the overridden method, but the argument types must match exactly”
So almost all discrepancies between parent/child parameter types (like int vs long) will be compiled as overloads. The only exception I know is — overriding method can remove “” from List as the parameter type.
There could be other subtle rules when we consider generics, but in the world without parameterized method signatures, the above Rule 1 is clean and simple.
[[ARM]] P212 explains the Multiple-inheritance would be problematic if this were allowed.