2017-02-03 18 views
7

私はKotlinに新たなんだと、コンパイラはこのコード文句なぜ私にはわからない:KotlinデータクラスとNULL可能タイプ

data class Test(var data : String = "data") 

fun test(){ 
    var test: Test? = Test("") 
    var size = test?.data.length 
} 

コンパイラはtest?.data.lengthと文句を言う、それは私がやるべきことを言う:test?.data?.length。しかし、データ変数はではなく、Stringであるので、長さをチェックするときに私が?を入れなければならない理由を理解できません。

答えて

10

発現test?.data.length(test?.data).lengthに相当し、test?.data部分がNULL可能である:それはtest.data又はnullのいずれかです。したがって、lengthを取得するのはnull-safeではありませんが、代わりにsafe call operatorを使用してください。test?.data?.length

nullの可能性はコールチェーン全体に伝播されます。これらのチェーンはa?.b?.c?.d?.e(これはやはり(((a?.b)?.c)?.d)?.eと等価)として記述する必要があります。これは、左側の部分の1つがnullの場合、残りの呼び出しはあたかも値がnullでないかのように実行される。

+0

今、わかりました。どうもありがとうございます! –

3

あなたは、コールチェーンの各非NULL可能コンポーネントの前に安全なコールを使用したくない場合は、標準の拡張機能runまたはletで新しい変数に最初の安全なコールの結果を得ることができます。

// `this` is non-nullable `Test` inside lambda 
val size = test?.run { data.length } 

// or: `it` is non-nullable `Test` inside lambda 
val size = test?.let { it.data.length } 

sizeはnullでも入力可能です。ここではInt?です。

+0

ありがとうございました! –

関連する問題