Рассмотрим перегруженную функцию foo
:
fun foo(i: Int) { /* */ }
fun foo(i_s: Collection<Int>) { /* */ }
Я получаю ошибку неоднозначности разрешения перегрузки со следующим кодом:
val bar = foo(Stream.empty<Int>().collect(Collectors.toList()))
Неоднозначность разрешения перегрузки:
public fun foo (i: Int): единица, определенная в ...
public fun foo (i_s: Collection): единица, определенная в ...
Насколько я могу судитьразрешение должно быть ясным: я собираю поток в список, поэтому следует взять foo(Collection<Int>)
.Еще несколько экспериментов предполагают, что не удалось правильно разрешить генерики, поэтому:
- Почему в этом случае не удается разрешить генерики?
- Документирован ли этот "недостаток" где-нибудь?Это ошибка, о которой я должен сообщить?
Я проверил несколько других вещей: foo(listOf())
не выдает ошибки, как и
val bar = Stream.empty<Int>().collect(Collectors.toList())
val baz = foo(bar)
Замена toList()
на toSet()
не изменяет поведение, но toCollection { ArrayList<Int>() }
компилируется во всех случаях.
Если я изменю foo
на fun <T> foo(i_s: Collection<T>)
, ошибка изменится на
Ошибка вывода типа.Ожидаемое несоответствие типов: выведенный тип является (изменяемым) списком!но ожидался Int
Это открывает для меня больше вопросов:
Почему разрешение работает, если я сохраняю промежуточный результат в переменной?В конце концов, его тип также разрешается автоматически? Что означает ошибка вывода типа?Почему это происходит?