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
когда вы его используете.
Технически есть запрос на то, что вы ищете, но прошло много лет с момента его создания.