【问题标题】:How to declare a function type throwable?如何声明一个可抛出的函数类型?
【发布时间】: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


【解决方案1】:

您不能使用@Throws 对函数参数进行注释,因为注释具有以下目标:AnnotationTarget.FUNCTION、AnnotationTarget.PROPERTY_GETTER、AnnotationTarget.PROPERTY_SETTER 和 AnnotationTarget.CONSTRUCTOR。

在 Kotlin 跟踪器中创建功能请求:https://youtrack.jetbrains.com/issue/KT-39688

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2011-03-20
    • 2018-09-15
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    相关资源
    最近更新 更多