The basic idea is that you always want to use the most general component whenever possible.
So, if I have a method, and all it does is print out the toString() method, I shouldn't force the argument to be a String, when I could just make the argument an Object. After all, every instance of an Object has a toString() method.
The more general, or abstract an argument is, the more flexible the method becomes. It makes your code more flexible and pluggable. That's the general idea.
subject: SCJA Question About Ancestor and Sub Classes