2016-09-06 70 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運算符,他們稱之爲,但不知道把它放在表達式中的位置。 –