Kotlin: Локальная функция передается встроенным функциям как параметр inlined?

При прохождении лямбды или анонимной функции к встроенным функциям в качестве параметра это довольно просто, код вставлен в вызывающую позицию, но при передаче локальной функции в качестве параметра результат кажется другим (как показано ниже). Интересно, если это встраивается? Почему или почему нет?

Например:

inline fun foo(arg: () -> Int): Int { return arg() } fun bar(): Int { return 0 } fun main(args: Array<String>) { foo(::bar) } 

И декомпилированный код Java:

 public final class InlinedFuncKt { public static final int foo(@NotNull Function0 arg) { Intrinsics.checkParameterIsNotNull(arg, "arg"); return ((Number)arg.invoke()).intValue(); } public static final int bar() { return 0; } public static final void main(@NotNull String[] args) { Intrinsics.checkParameterIsNotNull(args, "args"); bar(); } } 

bar() не объявляется встроенным . Так почему вы ожидаете, что он будет встроен ?!

Другими словами: было бы просто неправильно, что подпись метода A влияет (неявно) на подпись другого метода B.

Ваша идея (каким-то образом) повлияет на «семантику» bar () – только потому, что вы использовали bar() качестве аргумента для другого вызова метода.

Как вы можете в декомпилированном коде , kotlin не имеет встроенного bar в вашем случае, но он встраивает его, если он объявлен как inline fun bar() .

Правило состоит в том, что lambdas встроены, когда они передаются в встроенную функцию. Во всех других случаях, например, при передаче ссылки на функцию или лямбда-объекта, встраивание не выполняется.