public void foo(List<?> list) { }
public void foo(List<Object> list) { }
If there IS a difference (and we're not yet saying there is), what is it?
There IS a huge difference. List<?>, which is the wildcard <?> without the keywords extends or super, simply means "any type." So that means any type of List can be assigned to the argument. That could be a List of <Dog>, <Integer>, <JButton>, <Socket>, whatever. And using the wildcard alone, without the keyword super (followed by a type), means that you cannot ADD anything to the list referred to as List<?>.
That's not completely true and what actually happens is a good demonstration of why the Calendar class is implemented as a factory. If you look at the source code for the Calendar.getInstance() method you will see it calls the createCalendar method and that decides what type of Calendar subclass to return based on the locale. In other words you can use the same code wherever your program is run and an instance of the appropriate class will be returned