The up voted answers covers the details on many aspects. However, I would try to answer this in different way.
There are 2 things we need to consider,
List<? extends X> listvar;
Here, any list of X or list of subclasses of X can be assigned to listvar.
List<? extends Number> listvar;
listvar = new ArrayList<Number>();
listvar = new ArrayList<Integer>();
List<? super X> listvar;
Here, any list of X or list of superclasses of X can be assigned to listvar.
List<? super Number> listvar;
listvar = new ArrayList<Number>();
listvar = new ArrayList<Object>();
`List<? extends X> listvar;`
You can use this feature to accept a list in method arguments and perform any operations on type X (Note: You can only read objects of type X from the list).
`List<? super Number> listvar;
You can use this feature to accept a list in method arguments and perform any operations on type Object as You can only read objects of type Object from the list. But yes, additional thing here is , you can add objects of type X into the list.