Я сталкиваюсь с ошибкой компиляции при попытке использовать ссылки lambdas/function с kotlin:
class Foo {
fun getFilteredList(){
val numbers = listOf(1, 2, 3)
numbers.filter(::isOdd) // prints [1, 3]
}
fun isOdd(x: Int): Boolean = x % 2 != 0
}
Но я получаю ошибку времени компиляции, говоря о несоответствии типа:
Ошибка: (18, 16) Gradle: ошибка ввода типа: встроенная забава kotlin.Iterable.filter(предикат: (T) → kotlin.Boolean): kotlin.List нельзя применить к получателю: kotlin.List Аргументы: (kotlin.reflect.KFunction2) Ошибка: (18, 23) Gradle: Несоответствие типов: предполагаемый тип это kotlin.reflect.KFunction2, но (kotlin.Int) → ??? ожидалось Ошибка: (18, 23) Gradle: несоответствие типов: выведенный тип - kotlin.reflect.KFunction2 но (kotlin.Int) → kotlin.Boolean ожидалось Ошибка: (18, 25) Gradle: левая сторона вызываемой ссылки с параметр приемника не может быть пустым. Укажите тип приемник до '::' явно
Я не уверен, что такое ошибка, и какой тип я должен явно указывать перед '::'
Другой вопрос: Могу ли я использовать другую функцию объектов в качестве ссылки в котлин? Что-то вроде этого:
class Bar {
fun isOdd(x: Int): Boolean = x % 2 != 0
}
class Foo {
fun getFilteredList(){
val bar = Bar()
val numbers = listOf(1, 2, 3)
numbers.filter(bar::isOdd) // Use Bar method
}
}