我有一堆像这样具有可空属性的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
进行一些转换,每次都用一些小东西来清理它,同时一方面为我提供编译时保证和安全性,这在很大程度上是一个很大的麻烦。是否有一些简手来解决这些问题?
答案 0 :(得分:15)
你需要这样的双重感叹号:
val bar = makeNewBar(foo.name!!)
如Null Safety section中所述:
第三种选择适用于NPE爱好者。我们可以写b !!,这样就可以了 返回b的非空值(例如,在我们的示例中为String)或throw 如果b为空,则为NPE:
val l = b!!.length
因此,如果你想要一个NPE,你可以拥有它,但你必须明确地要求它,并且它不会出现在 蓝色。
答案 1 :(得分:0)
您可以使用扩展名:
fun <T> T?.default(default: T): T {
return this ?: default
}
然后像这样使用它:
fun getNonNullString(): String {
return getNullableString().default("null")
}