For example in the Java versions prior to Java 5, the following would have thrown a compile time error.
class Vehicle
{
Vehicle myFunc(){return this;}
}
class Car extends Vehicle
{
// myFunc() returns Car, which is a subclass of Vehicle
Car myFunc(){return this;}
public void printMe(){ System.out.println("I am a Car");}
}
public class Covariant {
public static void main(String args[])
{
Car car = new Car();
car.myFunc().printMe();
}
}CompileTime Error: The return type is incompatible with Vehicle.myFunc()
Prior to Java 1.5, to remove this error you had to make 2 changes.
1. Change the return type of derived class myFunc() to Vehicle and
2. Downcast Object being returned by car.myFunc() to Car
Java 5 lets you get away with that and makes the above code work just fine.
