Классы данных Kotlin и типы NULL

Я новичок в Kotlin, и я не знаю, почему компилятор жалуется на этот код:

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 , а не String? , Поэтому я не понимаю, почему я должен поставить ? Когда я хочу проверить длину.

Выражение test?.data.length эквивалентно (test?.data).length , а часть test.data имеет значение NULL: это либо test.data либо null . Поэтому для его length небезопасно, но вместо этого вы должны снова использовать оператор безопасного вызова : test?.data?.length .

Нулевая способность распространяется по всей цепочке вызовов: вам нужно написать эти цепочки как a?.b?.c?.d?.e (что опять же эквивалентно (((a?.b)?.c)?.d)?.e ), потому что, если одна из левых частей равна нулю, остальные вызовы не могут выполняться так, как если бы значение не было нулевым.

Если вы не хотите использовать безопасный вызов перед каждым невообразимым компонентом цепочки вызовов, вы можете получить результат первого безопасного вызова в новую переменную с run стандартных стандартных функций:

 // `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 по-прежнему недействителен Int? Вот.