2016-09-06 68 views
2

我有一堆豆子具有空的属性,像这样:将可空类型转换为不可空类型?

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

我相信编译器只会证明'foo!='null如果它在条件块内。你可以尝试用'if(foo!= null){...}'替换你的空检查。 – Actorclavilis

+2

[在Kotlin中,处理可空值的惯用方法是什么,引用或转换它们是什么](http:/ /stackoverflow.com/questions/34498562/in-kotlin-what-is-the-idiomatic-way-to-deal-with-nullable-values-referencing-o) –

回答

4

你需要双感叹号像这样:

val bar = makeNewBar(foo.name!!) 

由于记录在Null Safety section

第三个选项是NPE爱好者。我们可以写b!,这将 返回b的非空值(例如,在我们的例子一个字符串)或抛出 的NPE如果b为null:

val l = b!!.length 

因此,如果你想一个NPE,你可以拥有它,但你必须明确地要求它,它不会出现在蓝色以外。

+0

这将抛出'NullPointerException'if'foo.name'一片空白。看来,OP在这种情况下不想做任何事情,而不是抛弃。 – Actorclavilis

+0

谢谢。我把双重感叹号放在了错误的地方。我已经读过它,但使用'foo !!。name',它不会编译,我失去了希望。非常感谢。在我可以标记此答案之前11分钟。 –

+1

@Actorclavilis是的,谢谢。这是我想要的行为。我的意思是,我知道并且可以保证那不会发生,无论如何,这就是我所追求的行为。我读过关于这个运算符的NPE运算符,他们称之为,但不知道把它放在表达式中的位置。 –