【问题标题】:Kotlin null safety?Kotlin 零安全性?
【发布时间】:2014-07-09 21:19:26
【问题描述】:

让我们有一个函数foo和一个类Bar

fun foo(key: String): String? {
  // returns string or null
}

class Bar(x: String, y: String) {
  // ...
}

现在,让我们来看看代码:

val x = foo("x")
val y = foo("y")
if (x.isNotEmpty() && y.isNotEmpty())
  return Bar(x, y)

问题是这段代码无法编译。因为它需要Bar(x!!, y!!)

但是当我用它的内容替换函数时,!! 就不需要了。

val x = foo("x")
val y = foo("y")
if ((x != null && x.length() > 0) && (y != null && y.length() > 0))
  return Bar(x, y)

为什么无法从函数.isNotEmpty() 解析空检查?

【问题讨论】:

标签: kotlin language-design kotlin-null-safety


【解决方案1】:

这在理论上是可能的,但这意味着要么 1. isNotEmpty() 的声明必须向编译器传达这样一个事实:如果结果为真,x 保证为非空 2. 任何函数体的更改都可能导致其调用站点无法编译。

选项 2 绝对不能接受。选项 1 需要在类型系统中有一个相当有表现力的机制,我们决定暂时不添加,因为它可能会使用户的事情变得复杂。

我们计划通过内联函数支持类似的功能,但仍在考虑中。

【讨论】:

  • dogfooding 是否有类似的反馈? (因为!! 使代码不是很好。)
  • @TN。这是一个权衡:快速编译器/强大的库与更方便。没有人认为它非常漂亮。如果我们想出一些足够优雅但功能强大的东西,我们肯定会改进这些用例。
  • 我认为内联函数类似于宏,所以它可能在没有额外功能的情况下工作,或者?
  • @TN。从概念上讲,内联函数类似于(非常受限的)宏,但实际上我们使用的高效内部表示意味着需要一些额外的工作来支持这一点。
  • 其中一个选项在 YouTrack 中为:youtrack.jetbrains.com/issue/KT-8889 基本上是一种表达合同的想法,如果输入值有一些条件,那么输出也会如此。或者可能是一些仅基于可空性的简单定义,因为这是此类事情的最大收获。
猜你喜欢
  • 2021-03-15
  • 2021-07-19
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
  • 1970-01-01
相关资源
最近更新 更多