4

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)

関数から null チェックを解決できないのはなぜ.isNotEmpty()ですか?

4

1 に答える 1

3

これは理論的には可能ですが、次のいずれかを意味します。 1. isNotEmpty() の宣言は、結果が true の場合、x が非 null であることが保証されているという事実をコンパイラーに伝える必要があります。 2. any の本体への変更関数によって、その呼び出しサイトがコンパイルに失敗する可能性があります。

オプション 2 は絶対に受け入れられません。オプション 1 では、型システムにかなり表現力の高いメカニズムが必要ですが、ユーザーにとって複雑になる可能性があるため、現時点では追加しないことにしました。

インライン関数でこのようなものをサポートする予定ですが、まだ検討中です。

于 2014-05-21T12:13:01.627 に答える