Sergej, it's very simple, the method call is resolved at compile time.
Here compiler doesn't know what
<T> will be when this method is called at runtime. Since one of the method accepts
List<Number> (or
List<Integer>), the compiler cannot be sure if the
List<T> this method receives will fulfill the criteria or not (i.e. whether it will be
List<Integer> or
List<String>). So compiler *always* will resolve to
Collection<?>. It doesn't matter what you actually pass, when the above method is compiled, at that time the compiler decides it will always have to call the method which accepts
Collection<?>...