Как понять функциональный интерфейс 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например, чтобы объект-компаньон не был таким бессмысленным.

Другие вопросы по тегам