Обобщения в Kotlin: как это компилируется? - PullRequest
0 голосов
/ 23 марта 2020
    fun <E> Set<E>.containsAny(vararg elements: E) = intersect(elements.toSet()).isNotEmpty()

    fun test() {
        emptySet<String>().containsAny(1, Unit)
    }

Это компилируется в Kotlin, почему?

1 Ответ

1 голос
/ 23 марта 2020

Поскольку прогнозируемый тип аргументов будет <Any>. И тестовая функция может быть заменена на:

fun test() {
        emptySet<String>().containsAny<Any>(1, Unit)
    }

Для правильной работы функции необходимо явно передать тип:

fun test() {
        emptySet<String>().containsAny<String>(1, Unit) // Does not compile
    }

Или, если возможно, указать менее обобщенный c тип:

fun Set<Permission>.containsAny(vararg elements: Permission) = intersect(elements.toSet()).isNotEmpty()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...