The parameter of add() is <? extends String> which means an unknown subtype of String is in there. String is not a great example.
You should look at a simplier example like this :
So, l is a List<? extends A>. But what can you really put in there ? In the doSomething method, you don't know what kind of list it really is. Could you call l.add(new C()) ? C extends A. But we declared the list as containing B objects. With this type of wildcards, you can get objects from a collection, but not add any.