I cannot explain why the compiler will not consider them as equivalent, but given that this is not so, I will try to explain why it refuses to do this.
The first ( List<? extends Object> ) states that the type of objects stored in the List has an unknown type obtained from Object . The second ( List<?> ) Says less; he just says that the type of objects in the list is unknown. He does not mention the expected supertype as the upper bound of an unknown type.
To test the first assumption, the compiler wants to hear that you are saying something about the expected types stored in the List instance, constructed here as a raw LinkedList type that says nothing about it. However, if you were to create an instance of type LinkedList<Object> , you at least guarantee that covariant readings against the instance will be consistent with your statement: namely, that the things on this list are a kind of Object .
Now all this seems silly, because every reference / non-primitive type in Java extends Object , so there should be no difference in interpretation between List<? extends Object> List<? extends Object> and List<?> ; in the end, the second implies the first, by virtue of a language-type system that provides for a single-level hierarchy of classes.
source share