【问题标题】:Type mismatch inferred type is Unit but Void was expected类型不匹配推断类型为 Unit 但应为 Void
【发布时间】:2017-10-26 03:35:58
【问题描述】:

带有字符串和监听器(类似于 swift 中的闭包)参数的 kotlin 方法。

fun testA(str: String, listner: (lstr: String) -> Void) {

}

这样称呼它。

testA("hello") { lstr ->
    print(lstr)
}

错误:类型不匹配,推断类型为 Unit,但应为 Void

什么是单位??闭包的返回类型是Void。阅读很多其他问题,但可以通过这种简单的方法找到这里发生的事情。

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    根据Kotlin 文档,单元类型对应于Java 中的void 类型。所以在 Kotlin 中没有返回值的正确函数是

    fun hello(name: String): Unit {
        println("Hello $name")
    }
    

    或者什么都不用

    fun hello(name: String) {
        println("Hello $name")
    }
    

    【讨论】:

      【解决方案2】:

      如果您确实需要Void(它很少有用,但在与Java代码互操作时可能有用),您需要返回null,因为Void被定义为没有实例(与 Scala/Kotlin Unit 相比,后者只有一个):

      fun testA(str: String, listner: java.util.function.Function<String, Void?>) {
      ...
      }
      
      testA(("hello") { lstr ->
          print(lstr)
          null
      }
      

      【讨论】:

      • null 在最后一行?或return null??
      • “我们可以使用限定返回语法从 lambda 显式返回一个值。否则,最后一个表达式的值将被隐式返回。” kotlinlang.org/docs/reference/lambdas.html
      【解决方案3】:

      Kotlin 使用 Unit 代替 Void 来表示不返回任何内容的方法。它应该工作

      fun testA(str: String, listner: (lstr: String) -> Unit) {
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 2020-04-24
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多