Почему Котлин не может определить тип для компаратора - PullRequest
0 голосов
/ 12 сентября 2018

Чтение документа взаимодействия Java о SAM Conversions , я ожидал, что функция Kotlin

Collections.sortWith(comparator: kotlin.Comparator<in T> /* = java.util.Comparator<in T> */)

чтобы иметь возможность принимать лямбда-функцию без необходимости явно указывать параметр Comparator. Однако следующий код дает type inference failed:

val someNumbers = arrayListOf(1, 5, 2)
someNumbers.sortWith({ x, y -> 1 })

тогда:

val someNumbers = arrayListOf(1, 5, 2)
someNumbers.sortWith(Comparator { x, y -> 1 })

компилируется и работает правильно

1 Ответ

0 голосов
/ 12 сентября 2018

После прочтения комментариев к проблеме Kotlin 'SAM для классов Kotlin' Я многое узнал о преобразовании SAM и почему было введено typealias, но пока не удалось выяснить, почему это специфическое поведение не было решено.пока ... и я не единственный, как показывает проблема и ее комментарии.

Подводя итог, преобразование SAM рассматривалось только для интерфейсов Java (сравните также этот комментарий ).Jetbrains работал над (или все еще должен сделать) большим рефакторингом и пытается решить эту проблему, чтобы SAM также были доступны для самих функций Kotlin (сравните также этот комментарий ).Они пытаются поддержать преобразование SAM для функций kotlin в отдельном выпуске , который может поставляться с 1.3.Поскольку я сейчас тестирую 1.3: я еще ничего не видел по этому поводу.Так что, может быть, если вам нравится преобразование SAM, как и мне, вы можете повысить SAM для классов Kotlin или SAM для функции kotlin или оба.

Кстати: очень похожий пример также использовал Илья Горбунов, используя arrayOf().sort.

...