Firstly, why does the first line compile while the second does not? Secondly, in the case of the second line, do both types always need to be the same i.e Integer on the left and Integer on the right. Or is it possible to have different types on the left and the right?
List<? super Integer> nums1 = new ArrayList<Number>(); //COMPILES
List<Integer> nums2 = new ArrayList<Number>(); //DOES NOT COMPILE