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,
1. Assignment to the list variable
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();
listvar = new ArrayList();
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();
listvar = new ArrayList
2. Perform Read or Write operation on the list variable
`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.