Kotlin:本地函数是否作为内联参数传递给内联函数?

将lambda函数或匿名函数作为参数传递给内联函数时,很简单,代码粘贴到调用位置,但是当传递本地函数作为参数时,结果看起来不同(如下所示)。 我想知道是否内联? 为什么或者为什么不?

例如:

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() ,它会内联它。

规则是传递给内联函数时,lambda被内联。 在所有其他情况下,例如传递一个函数引用或一个lambda对象,不会内联。