import java.util.*; abstract class A { static <T> void foo(List<T> x) { } static <T extends List<?>> void foo(Collection<T> x) { } public static void main(String[] args){ List<List<String>> x = null; foo<error descr="Ambiguous method call: both 'A.foo(List<List<String>>)' and 'A.foo(Collection<List<String>>)' match">(x)</error>; foo<error descr="Ambiguous method call: both 'A.foo(List<Object>)' and 'A.foo(Collection<List<?>>)' match">(null)</error>; } }