Это потому, что когда компилятор разрешает перегрузки , он рассматривает каждый метод как универсальный или неуниверсальный, а не как смесь двух, поэтому кандидаты:
Foo<T>.baz(List<String>)
Foo<T>.baz(ArrayList<Object>)
, если foo
является Foo<String>
или
Foo.baz(List)
Foo.baz(ArrayList)
, если foo
является Foo
.
Нет такой вещи как Foo.baz(List<String>)
.Либо все параметры типа учитываются, либо нет.(Мне не известно, что это явно указано в JLS, но это имеет смысл, поскольку обработка универсального метода так, как если бы он был необработанным эквивалентом, является функцией обратной совместимости.)
В первом случае Foo<T>.baz(List<String>)
соответствует, но Foo<T>.baz(ArrayList<Object>)
не соответствует.
Во втором случае обе функции совпадают, а Foo.baz(ArrayList)
является более конкретным , поэтому он выбран.