Okay, so this is due to a subtle semantic difference.
List
This is the raw type of List
, which equates to T
being of type Object
. So it's the same as saying:
List<Object>
Now, the Compiler knows for a fact, that whatever happens, this is a subclass of type Object
. And if you do..
List myList = new ArrayList();
myList.add(new Object());
It will work fine! This is because Object
is the same or it is some derivation of the type.
List<?>
This is literally a list of unknown (Java Docs). We don't even know that the subclass of the things in here are of type Object
. In fact, the ?
type is an unknown type all on its own. It has nothing to do with Object
! This is why when you try and do..
List<?> myList = new ArrayList<?>();
myList.add(new Object());
You get a compile time error!