Ваш второй вызов anyPair()
не имеет никакого способа определить его типы, поэтому по умолчанию он равен <Object, Object>
.
. Компилятор разбивает process(p, anyPair());
на части и обрабатывает каждый по отдельности.Когда он делает это, он должен сначала обработать аргументы, чтобы определить их типы, которые затем могут быть использованы при обработке process
.
Когда он переходит к обработке anyPair()
, для этого нет информации о типе.кусок, потому что он не знает, что он является частью process
на тот момент.По умолчанию он равен <Object, Object>
, что приводит к несоответствию типов при просмотре process
.
То же самое происходит со вторым примером.Collections.emptySet()
должен быть обработан сам по себе, но у него нет способа определить необходимые типы.
Есть 2 способа решить эту проблему:
Первый - дать компилятору информацию, которую оннуждается в выводе типа так же, как вы делали это при первом вызове anyPair()
, сохраняя его во временной переменной с правильным типом.
Вторым (благодаря @BalusC) является использование ExampleA.<String, Integer>anyPair()
,Этот синтаксис явно устанавливает необходимые типы без необходимости смотреть за пределы вызова.