Taken from https://stackoverflow.com/a/19231762/1498827
public class Test {
    public class A {}
    public class B extends A {}
    public class C extends B {}
    public void testContraVariance(List<? super B> myBlist) {
        B b = new B();
        C c = new C();
        myBlist.add(b);
        myBlist.add(c);
        A a = myBlist.get(0); // does not compile
    }
}
If myBlist accepts a super type of B ,which means B or up, then why can you also add a child to it as in myBlist.add(c) ?
 
     
     
    