2016-09-06 16 views
2

私はそうのようなNULL可能な特性を持っている豆の束がありますNullable型をNullable型に変換しないでください。

package myapp.mybeans; 

data class Foo(val name : String?); 

をそして、私はそうのようなグローバル空間内のメソッドを持っています。

package myapp.global; 

public fun makeNewBar(name : String) : Bar 
{ 
    ... 
} 

そしてどこか、私が行う必要がありますFooの中のものからのBarだから、私はこれを行う:

また
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を証明すると信じています。 – Actorclavilis

+2

[Kotlinでは、null値を扱う慣習的な方法は、参照または変換するものです](http: /stackoverflow.com/questions/34498562/in-kotlin-what-is-the-idiomatic-way-to-deal-with-nullable-values-referencing-o) –

答えて

4

あなたはそうのような二重の感嘆符が必要ですNull Safety sectionに記載したよう

val bar = makeNewBar(foo.name!!) 

第三の選択肢は、NPE-愛好家のためです。私たちは!! Bを書き込むことができ、これは (例えば、この例ではString)をBのnull以外の値を返すか、またはbがnullの場合 NPEがスローされます。

val l = b!!.length 

したがって、あなたがしたい場合NPEなら、あなたはそれを持つことができますが、それを明示的に求めなければなりません。それは青色の には現れません。

+0

これは、 'foo.name'の場合に' NullPointerException'をスローします無効である。 OPはそのような場合には何もしたくないと思われます。 – Actorclavilis

+0

ありがとうございます。私は間違った場所に二重の感嘆符をつけていた。私はそれについて読んだが、 'foo !!。name 'を使っていたので、コンパイルされず、私は希望を失っていた。どうもありがとう。 11分前に私はこの答えに印を付けることができます。 –

+1

@Actorclavilisはい、ありがとうございます。それが私が望む行動です。私は、私が知っていることを保証することができますそれは起こることはありませんので、それは、とにかく後の動作です。私はこの演算子についてNPE演算子を読んでいますが、それを呼び出すのですが、どこに式を入れるのかはわかりませんでした。 –

関連する問題