After consulting the JLS and my book on generics I am still uncertain how to explain the following behavior.
The only error is the compile time error at line 15.

Java Code:
public class GenericsTest {
  
   public void startUp() {
      List<Bar> list = new ArrayList<>();
      // List<Bar> is a subtype of Collection<? extends Bar>
      // therefore the following is permitted
      Collection<? extends Bar> coll = list;

      // This also works as expected
      Foo1<Bar> foo1 = new Foo1<>();
      foo1.doit(list);

      Foo2<? extends Bar> foo2 = new Foo2<>();
      // Why is the following statement not permitted?
      foo2.doit(list); // <------ compile time error (see next comment)
      /**
       * The method doit(Collection<capture#1-of ? extends Bar>) in the type
       * Foo2<capture#1-of ? extends Bar> is not applicable for the arguments
       * (List<Bar>)
       */
   }
}

class Foo1<T> {
   public void doit(Collection<? extends T> b) {
   }
}

class Foo2<T> {
   public void doit(Collection<T> b) {
   }
}

class Bar {
}

Any clarification of this would be appreciated (especially the relevant passage in the JLS).

Regards,
Jim