首页 > 解决方案 > Kotlin 单表达式函数的 Java 签名

问题描述

我有几个想要从 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”签名?

谢谢!

虚拟现实

标签: javakotlinjava-native-interface

解决方案


的返回类型

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

是任何eventLayer?.onDisconnection回报。这至少包括null,因为这就是它在eventLayer为空时返回的内容。

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

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

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

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


推荐阅读