次のような null 許容プロパティを持つ Bean がいくつかあります。
package myapp.mybeans;
data class Foo(val name : String?);
そして、グローバル空間には次のようなメソッドがあります。
package myapp.global;
public fun makeNewBar(name : String) : Bar
{
...
}
Bar
そして、どこか別の場所で、の中にあるものから を作成する必要がありますFoo
。そこで、次のようにします。
package myapp.someplaceElse;
public fun getFoo() : Foo? { }
...
val foo : Foo? = getFoo();
if (foo == null) { ... return; }
// I know foo isn't null and *I know* that foo.name isn't null
// but I understand that the compiler doesn't.
// How do I convert String? to String here? if I do not want
// to change the definition of the parameters makeNewBar takes?
val bar : Bar = makeNewBar(foo.name);
また、foo.name
毎回ちょっとしたことでクリーンアップするためにここで何らかの変換を行うと、一方ではコンパイル時の保証と安全性が提供される一方で、ほとんどの場合大きな面倒になります。これらのシナリオを回避するための簡単な方法はありますか?
ベストアンサー1
次のように二重の感嘆符が必要です:
val bar = makeNewBar(foo.name!!)
文書に記載されているようにNull 安全セクション:
3 番目のオプションは NPE 愛好家向けです。b!! と記述すると、b の null 以外の値 (この例では文字列) が返されます。b が null の場合は NPE がスローされます。
val l = b!!.length
したがって、NPE が必要な場合はそれを入手することができますが、明示的に要求する必要があり、突然表示されることはありません。