Как понять функциональный интерфейс Kotlin с сопутствующим объектом внутри?
Я хотел бы получить некоторую помощь, чтобы понять фрагмент кода Kotlin о функциональном интерфейсе, используемом в Http4k.
org.http4k.core
упаковка
typealias HttpHandler = (Request) -> Response
fun interface Filter : (HttpHandler) -> HttpHandler {
companion object
}
Я не разбираюсь в интерфейсе, особенно в его части. Типичный функциональный интерфейс выглядит так
fun interface IntPredicate {
fun accept(i: Int): Boolean
}
И вы можете создать лямбду
isEven
val isEven = IntPredicate { it % 2 == 0 }
Согласно этому простому примеру, интерфейс выглядит так:
Filter
расширяет другой интерфейс
(HttpHandler) -> HttpHandler
? Тогда он определяет сигнатуру функции? Это правильно? Что значит часть
companion object
на самом деле означает?
1 ответ
Filter
расширяется, а тип функции имеет единственный абстрактный метод (оператор) -
invoke
- неявно объявлено, например:
operator fun invoke(HttpHandler): HttpHandler
Так что это сигнатура функции для функционального интерфейса, а не.
companion object
означает то, что всегда означало - объявление сопутствующего объекта . Сопутствующий объект может показаться пустым, просто взглянув на код, который вы показали, и это заставляет задуматься, какова его цель. Если вы удалили объявление, функциональный интерфейс все равно будет скомпилирован и может использоваться так же, как функциональный интерфейс, представляющий тип функции.
(HttpHandler) -> HttpHandler
.
Однако, если вы посмотрите дальше по файлу , вы увидите, что существует (по крайней мере) одна функция расширения, объявленная для сопутствующего объекта:
val Filter.Companion.NoOp: Filter get() = Filter { next -> { next(it) } }
Это позволяет вам делать
val noOp = Filter.NoOp
например, чтобы объект-компаньон не был таким бессмысленным.