【发布时间】:2020-06-18 08:44:54
【问题描述】:
我知道在 kotlin-multiplatform 中,您可以使用 @Throws 注释函数以使其成为可抛出函数。因此,转换后的 Java/Swift 代码对函数签名具有 throws 修饰符。
但是,当我有一个函数的参数也是一个函数时,我如何标记这个函数是可抛出的?
例如:
fun foo(run : () -> Unit) {}
上面的函数有一个参数“run”,它接受一个闭包/函数。但是这个参数将在没有“throws”修饰符的情况下编译,所以在 Java/Swift 中,我不能在传递给这个函数的闭包中抛出任何东西。
我尝试将@Throws 注释添加到函数中。将它放在函数声明之外会导致 foo() 函数被标记为“抛出”。将其放在参数括号中,无论是在冒号之前还是之后,都会导致错误提示注释不适用于目标“值参数”/“类型用法”
总而言之,我正在寻找的是这样的:
fun foo(@Throws(Throwable::class) run : () -> Unit)
or
fun foo(run : @Throws(Throwable::class) () -> Unit)
非常感谢您对此问题的任何提示/帮助!
【问题讨论】:
-
您能否描述一下您的用例以及您希望编译器如何处理参数上的
@throws注释? -
解决此问题的一种方法是创建自己的界面,而不是使用函数。然后,您可以正确地注释它。在 Kotlin 1.4 中,当从 Kotlin 调用时,lambda 可用于函数式接口。仍然会有奇怪的麦芽汁需要从 Java 返回 Unit.INSTANCE。
标签: kotlin-multiplatform kotlin-native