I try to explain the issue in an example. I got an interface named X and an I got an class Y which implements X. Several instances of Y are collected in a List. Now here is the point i don't really understand. When I'm trying to assign this list to a collection I get an compiler error. Otherwise when I'm assigning this list to a collection it works.
List<Y> yList = new ArrayList<Y>();
// works
Collection<? extends X> coll1 = yList;
// error
Collection<X> coll2 = yList;
Could anybody explain whats the difference between those two variants and why the second one does not work.