Prior to JDK 5.0, the return type could not change when overriding a method. It is now legal to use a subtype in the overriding method. A typical example is the clone method.
5.0
1.4
public Employee clone() { ... } ... Employee cloned = e.clone();
public Object clone() { ... } ... Employee cloned = (Employee) e.clone();