Kotlin Функция Literal с любым типом приемника - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь заставить kotlin принять тип интерфейса в качестве получателя для функции, но я получаю ошибку компиляции, говорящую о несоответствии типов.

Вот пример:

interface Foo

class Bar : Foo

fun main() {
    val l = initBar {

    }

    initFoo(l) // Doesnt work compile error: Type mismatch.
                                                //Required:
                                                //  Foo.() → Unit
                                                //Found:
                                                //  Bar.() → Unit
}

fun initBar(init: Bar.() -> Unit) = init


fun initFoo(init: Foo.() -> Unit) = Unit

Я получаю следующую ошибку компиляции из этого кода

Type mismatch.
Required:
Foo.() → Unit
Found:
Bar.() → Unit

Есть ли способ заставить функцию initFoo принимать любой объект-получатель, который реализует Foo без приведения?

Спасибо.

1 Ответ

3 голосов
/ 13 апреля 2020

Используйте для него обобщенный тип c:

fun <T: Foo> initFoo(init: T.() -> Unit) = Unit

Обратите внимание, это ограничивает то, что вы можете делать с ним внутри функции. Так как вы принимаете функцию, которая может быть вызвана для определенного типа c, вы не можете вызвать переданную лямбду для любого Foo.

fun <T: Foo> initFoo(init: T.() -> Unit) {
    val someFoo = object: Foo {}
    someFoo.init() // ERROR (type mismatch)
}

Это потому, что, например, ваш Bar.() -> Unit функция может использовать свойства и функции Bar, которые не обязательно являются частью любого произвольного Foo.

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