【问题标题】:How Kotlin inferencing return type of function with expression bodyKotlin 如何使用表达式体推断函数的返回类型
【发布时间】:2021-07-17 13:43:36
【问题描述】:

如果函数只包含一个表达式,则可以从该表达式推断出它的返回类型。 听起来很简单:

fun max(a: Int, b: Int) = if (a > b) a else b

在这种情况下,函数的返回类型将是 Int。

但是下一个例子中会是什么类型呢?

fun max(a: Int, b: Int) = if (a > b) a else true

【问题讨论】:

  • 它是Any。您所要做的就是将该代码写入任何 IDE,它会告诉您这一点。如果你想知道更多关于Anyhave the docs here
  • 对不起,没有意义。最好的答案来自 Kotlin 编译器本身:尝试并报告。我猜? “这个函数不正确。”
  • @duffymo 函数是正确的,它可以编译和运行得很好,在 Java 中它相当于返回 Object
  • 这个特殊的例子?不知道。但是返回多种类型的函数(在Any 下)并不少见(并不是说它们是最好的解决方案,它们通常指向代码异味)。
  • @duffymo 哦,对了,你特别在谈论那个 max 函数的目标。当然没有意义。这只是一个关于类型推断行为的理论问题。我不认为我们应该尝试看这里的代码的含义。

标签: function kotlin expression type-inference


【解决方案1】:

推断只是给出表达式可能值类型的最接近的祖先。

在这里,您的表达式可以生成 BooleanInt。在这种情况下,最近的祖先是 Comparable<*>,所以这是您的函数的返回类型。

如果类型完全不相关,则共同祖先将是Any,在 Kotlin 中,它是所有不可为空类型的共同祖先。 如果其中一个值也可以为 null,那么您最终可能会得到一个返回类型 Any?,它是 Kotlin 中所有类型的最终父级(类似于 Java 的 Object)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-01
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多