же, хотя тип у { _: 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 для ко/контр-вариативности
Хм, удивительное рядом, ты прав, эти модификаторы можно использовать только при описании классов/интерфейсов.
Обсуждают сегодня