Kotlin无效安全?
让我们有一个函数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()
解析空检查?
这在理论上是可能的,但是这意味着要么1.如果结果为真,则isNotEmpty()的声明必须传递给编译器x保证为非null的事实2.对任何函数可能会导致其调用网站无法编译。
方案2绝对不能接受。 选项1在类型系统中需要一个相当有表现力的机制,我们现在决定不添加这个机制,因为这很可能会使用户复杂化。
我们正在计划通过内联函数来支持这样的事情,但它仍在考虑之中。