Consider the following situation:
public abstract class AnimalFeed{
}
public class FishFeed extends AnimalFeed{
}
public class BirdFeed extends AnimalFeed{
}
You'd need to add a type variable to the class:
public abstract class Animal {
public abstract void eat(F somethingToEat);
}
Then you can declare your subclasses as wanting a particular type of AnimalFeed:
public class Bird extends Animal {
public void eat(BirdFeed somethingToEat) {}
}
public class Fish extends Animal {
public void eat(FishFeed somethingToEat) {}
}