With "programming to interfaces" it is meant that, as much as possible,
you should declare your variables or parameters as being of the interface type, not an implementation type. So:
instead of
This allows you to change the implementation class if needed; if a LinkedList or TreeSet becomes better, you only need to change it when you initialize or assign to the variable.
Please note that this principle also holds for non-interface classes: declare as broad as possible. So don't declare as SimpleDateFormat but as DateFormat, don't declare as JPanel but as JComponent or better yet Container or Component*. This principle is used to a great extent in Containers themselves - they can except any Component, it doesn't matter of which class.
* Of course if you need methods / fields of a specified subclass (such as JSpinner's getValue() method) there is nothing wrong with declaring it as a JSpinner because it's obvious that you'll never use anything else.