Java inheritance; passing a subclass to an abstract method of a superclass

abstract, inheritance, interface, java

Solution

You can use Generics to solve this:

public abstract class Fixer<T extends Vehicle> {
    abstract void fix(T vehicle);
}

public class CarFixer extends Fixer<Car> {
    void fix(Car car) {...}
}

The problem with your original version is that the `fix` method allows any type of vehicle, but your implementing class allows only cars. Consider this code:

Fixer fixer = new CarFixer();
fixer.fix(new Bike()); // <-- boom, `ClassCastException`, Bike is a vehicle but not a car

Problem

Sorry for the title, couldn't come up with anything clearer. I have the following structure: ``` public interface Vehicle {...} public class Car implements Vehicle {...} ``` then: ``` public abstract class Fixer { ... abstract void fix(Vehicle vehicle); ... } ``` and would like to have: ``` public class CarFixer extends Fixer { void fix(Car car) {...} } ``` but this doesn't work. Eclipse says: `The type CarFixer must implement the inherited abstract method Fixer.fix(Vehicle)`. Any idea how can I solve this?

Original source