Как определить функциональный интерфейс с дженериками в Kotlin? - PullRequest
4 голосов
/ 25 марта 2019

Я изучаю Kotlin, и у меня есть некоторые проблемы с функциями.Я пытаюсь создать что-то вроде функционального интерфейса с универсальным параметром.В Java я хотел бы создать что-то вроде этого:

@FunctionalInterface
public interface Foo<T extends Bar> {
    String something(T arg);
}

Затем я могу использовать это где-то еще, как это (учитывая, что Person расширяется Bar:


Foo<Person> f = p -> p.toString();

Как вынаписать это с помощью Kotlin?

Первое, что я попробовал, было использовать псевдонимы типа, подобные этому:

typealias Foo<T> = (T) -> String

Однако он перестал работать, когда я добавил привязку к параметру типа:

typealias Foo<T: Bar> = (T) -> String  // Error: Bounds are not allowed on type alias parameters

Второй подход заключался в написании интерфейса, расширяющего тип функции:

interface Foo<T: Bar> : (T) -> String

Однако теперь я не знаю, как создать экземпляр лямбда-функции с помощью этого.работает, когда я создаю из него класс следующим образом:

class Something: Foo<Person> {
    override fun invoke(p: Person): String {
        return p.toString()
    }
}

val f = Something()

Но это большие издержки, и я уверен, что должно быть лучшее решение.

Так как я могу определитьсигнатура функции, которую можно использовать во многих функциях, которые поддерживают общие параметры с границами в kotlin?

1 Ответ

4 голосов
/ 25 марта 2019

В большинстве случаев (всегда?) Достаточно определить тип лямбды в параметре функции, которая его получает.

Например:

open class Bar
class Person: Bar()

var f = { p: Person -> p.toString() }

fun <T : Bar> withFoo(block: (T) -> String) { }
fun <T : Bar> otherFoo(block: (T) -> String) { }   

fun main() {
    withFoo(f)
    otherFoo(f)
}

точно так же документация Kotlin гласит: «поскольку Kotlin имеет надлежащие типы функций, автоматическое преобразование функций в реализации интерфейсов Kotlin не требуется и, следовательно, не поддерживается».

См. https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions

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