Java Kotlin 单表达式函数的签名

Java signature for Kotlin single-expression functions

我想从 JNI 调用几个 Kotlin 方法。

在我当前的实现中,我在 Kotlin 端有以下源代码。

    var eventLayer: EventInterface? = null

    private fun onDisconnection(start: Boolean)  {
        eventLayer?.onDisconnection(start)
    }

方法签名是 "onDisconnection(Z)V",一切正常。

这么简单的方法,我想到了用单表达式函数。有点像。

    var eventLayer: EventInterface? = null

    private fun onDisconnection(start: Boolean) = eventLayer?.onDisconnection(start)

当 运行 我的应用程序时,我有一个(没想到!)NoSuchMethod 异常,我检查了方法签名,它更改为 "onDisconnection(Z)Ljava/lang/Void;"

谁能给我解释一下这个细微的差别?有没有办法让单表达式函数具有相同的“(Z)V”签名?

谢谢!

VR

的return类型
private fun onDisconnection(start: Boolean) = eventLayer?.onDisconnection(start)

是任何 eventLayer?.onDisconnection returns。这至少包括 null,因为当 eventLayer 为空时,它就是 return。

如果您关心此函数的 return 类型,那么您可能应该声明它。然后你会得到一个编译器错误,因为 null 不是 Unit.

我很确定你可以像这样修复它:

private fun onDisconnection(start: Boolean) : Unit = 
    eventLayer?.onDisconnection(start) ?: Unit

... 但是将 = 与不产生任何值的表达式一起使用是很奇怪的。你可能应该只用大括号写它。