Почему я получаю сообщение об ошибке «Смарт-бросок в« Лонг »невозможно» в Котлине? Но это нормально в java?

Я пытаюсь запустить следующий код, но код не может передать компиляцию, я получаю ошибку:

Смарт-бросок до «Длинный» невозможно, потому что «i» является изменчивым свойством, которое к этому моменту могло быть изменено

Зачем?

class MyClass1(var i: Long?) { fun change(): Long? { if (i != null) { return i + 10L } else { return 5L } } } 

Я написал код MyClass2 в Java, он может работать хорошо, почему?

 class MyClass2{ private Long i; public MyClass2(Long k){ i=k; } public Long change(){ if (i!=null){ return i+10L; }else { return 5L; } } } 

Поскольку i является var , теоретически его можно изменить другим потоком между вашей нулевой проверкой и плюсом-операцией.

Вы можете использовать функцию let для ее решения. Он «захватит» значение i , указав его как параметр.

 fun change(): Long? { return i?.let { it + 10L } ?: 5L }