In general using the least specific applicable type for a variable gives you more flexibility.
For example, say you're writing a method that operates on a list of items. The list is to be passed in as an argument. If you declare the argument type to be ArrayList, then only callers who have an ArrayList full of items can use your method. What if they already have a LinkedList full of items to process? Even though ArrayList and LinkedList have virtually the same list of methods, your method won't work with a LinkedList. This is bad.
Instead, you could declare your method to accept an argument of type List, and use only the methods of the List interface in implementing your method. Now callers can pass in any kind of List at all -- your method is more useful, and all you did was erase a few letters!
You can make similar arguments about using general types within a single method. Using more general variable types makes it much easier to change a method to use a different specific type. ArrayList and LinkedList have very different performance characteristics. If you wrote a program using an ArrayList but later find that a LinkedList would be faster, it'd be nice to be able to make one change in one place and have everything work, right? Well, using the most general possible variable types enables this kind of simple change.