When you use extends to denote a type parameter bound, you are not requiring a subclass-superclass relationship, but merely a subtype-supertype relationship. It is also important to remember that the bounded type does not need to be a strict subtype of the bound; it could be the bound as well.
In other words, for a Collection<? extends Number>, you could assign a Collection<Number> (although Number is not a strict subtype of Number) as well as a Collection<Integer>, Collection<Long>, Collection<Float>, and so on but you can not assign a Collection <Object> even though Object is a superclass of Number
Thanks and Regards,<br />Dhaval Shah<br />SCJP 1.4<br />SCWCD 1.4
this is because at runtime, there is no difference between a generics collection and a non-generics collection. (Type erasure) ArrayList<? extends C> arl is as good as ArrayList arl at runtime. if there is no compile time error, then anything can be added to collection at runtime which will break the type safety. So normally you will no be able to assign a ArrayList<C> arl = new ArrayList<A>, but the wildcards '?' allow you to do the assignment and with extends it can be read only, you can't do structural modifications.