Плохой вывод Kotlin дает неоднозначность разрешения перегрузки - PullRequest
6 голосов
/ 06 июля 2019

Рассмотрим перегруженную функцию 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>).Еще несколько экспериментов предполагают, что не удалось правильно разрешить генерики, поэтому:

  1. Почему в этом случае не удается разрешить генерики?
  2. Документирован ли этот "недостаток" где-нибудь?Это ошибка, о которой я должен сообщить?

Я проверил несколько других вещей: 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

Это открывает для меня больше вопросов:

Почему разрешение работает, если я сохраняю промежуточный результат в переменной?В конце концов, его тип также разрешается автоматически? Что означает ошибка вывода типа?Почему это происходит?

1 Ответ

2 голосов
/ 10 июля 2019

Похоже, что это ошибка в старом алгоритме вывода, потому что он работает правильно с новым выводом. Я подал проблему в трекер ошибок Kotlin, по крайней мере, для добавления регрессионного теста. Вы можете следить за обновлениями.

Больше информации о новом выводе:

https://youtrack.jetbrains.com/issue/KT-31507

https://blog.jetbrains.com/kotlin/2019/06/kotlin-1-3-40-released/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...