If you have a class hierarchy A, B is a subclass of A, and C and D both are subclass of B like belowpost
class A {} class B extends A {} class C extends B {} class D extends B {}
Thenthis
List<? extends A> la; la = new ArrayList<B>(); la = new ArrayList<C>(); la = new ArrayList<D>(); List<? super B> lb; lb = new ArrayList<A>(); //fine lb = new ArrayList<C>(); //will not compile public void someMethod(List<? extends B> lb) { B b = lb.get(0); // is fine lb.add(new C()); //will not compile as we do not know the type of the list, only that it is bounded above by B } public void otherMethod(List<? super B> lb) { B b = lb.get(0); // will not compile as we do not know whether the list is of type B, it may be a List<A> and only contain instances of A lb.add(new B()); // is fine, as we know that it will be a super type of A }
A bounded wildcard is like ? extends B
where B is some type. That is, the type is unknown but a "bound" can be placed on it. In this case, it is bounded by somespa