Наличие getter возвращает тип с нулевым значением, даже если поле поддержки является нулевым

num должен быть нулевым, если он установлен, но возвращаемое значение всегда должно быть непустым (иметь значение по умолчанию).

 class Test { var num: Int? = null get() = field ?: 5 // default value if null } 

Следующее не компилируется, хотя возвращаемое значение всегда не пустое, что имеет смысл для меня, потому что тип не выводится, а берется из поля поддержки:

 val a: Int = Test().num 

Тип несоответствия: выведенный тип Int? но Int ожидался

Вопрос в том, как изменить тип возвращаемого значения того, что getter не должен иметь значение NULL? Если я это сделаю, компилятор говорит:

Тип возврата Getter должен быть равен типу свойства, т. Е. 'Int?'


Я знаю, что могу решить его с помощью другого свойства numNotNullable (без поля поддержки).

 class Test { var num: Int? = null get() = field ?: 5 // default value if null val numNotNullable: Int get() = num ?: 5 } val c: Int = Test().numNotNullable 

Но этого я не хочу. Есть ли другой способ?

var num: Int? = null

Это ваша подпись собственности. Это не имеет значения, если вы внутренне гарантируете, что никакое значение null не будет возвращено. Подпись гласит, что значение равно NULL.

Это подразумевает:

  • Вы можете установить значение null в это поле
  • Все классы, использующие это поле, должны обрабатывать тот факт, что свойство может возвращать значение null

Ваше решение со вторым имуществом хорошее.

Вы, конечно, можете заменить свойство простым старым java bean, но я бы не советовал это, потому что вам нужно получить доступ к prop с помощью getNumb и setNum .

 class Test { private var num: Int = 5 fun setNum(num: Int?) { this.num = num ?: 5 } fun getNum() = num } 

Я не думаю, что это возможно в Котлине. Вы не можете переопределить тип свойства для get / set. Итак, если ваша собственность Int? вам придется вернуть Int? и проверьте, является ли оно null когда вы его используете.

Технически есть запрос на то, что вы ищете, но прошло много лет с момента его создания.