Я изучаю 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?