же, хотя тип у { _: Any? -> true } будет (Any?) -> Boolean, а не (*) -> Boolean
Более общий вопрос заключается в том, как быть с вариантностью in и out для сигнатур функциональных типов.
В Java можно объявить такую конструкцию:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
то есть map принимает на вход функцию, контрвариантную по своему параметру и ковариантную по результату.
В Kotlin функции, передаваемые в map инвариантны:
public fun <T, R> Sequence<T>.map(transform: (T) -> R): Sequence<R>
Хотя похоже, что в Kotlin сами функциональные типы контрвариантны по своим параметрам и ковариантны по результату.
Иначе я не могу понять, почему компилируется вот этот код:
fun main(args: Array<String>) {
fun test(f: (Double) -> Number): Nothing = TODO()
val f: (Number) -> Double = Number::toDouble
test(f)
}
Так * - означает не кванитифицированный тип, т/е ограниченный Object сверху, т/е считай тем же Any, Any? если учитывать null, т/е все то же.
Используются модификаторы out/in для ко/контр-вариативности
Хм, удивительное рядом, ты прав, эти модификаторы можно использовать только при описании классов/интерфейсов.
Обсуждают сегодня