Можно ли привести поле к ненулевой версии самого себя?

У меня есть класс данных

data class MyModel(private val _data: MyData? = null)

И я хочу убедиться, что мои данные доступны только тогда, когда они не равны нулю, иначе выведите. Я использую ниже, что хорошо.

    fun getData(): MyData {
        return checkNotNull(_data) { "data shouldn't be null" }
    }

Однако, если я буду следовать руководству согласно методу переопределения для класса данных Kotlin, жалобы, приведенные ниже, мне нужно будет вернуть MyData? вместо MyData

val data = _data
    get(): MyData {
        return checkNotNull(field) { "data shouldn't be null" }
    }

Это правда, что field не может быть приведен к ненулевой версии этого при возврате?

3 ответа

Решение

Если ваша цель - объявить получателя для Any? свойство, которое возвращает Any, это невозможно. Вы получите следующую ошибку:

Возвращаемый тип геттера должен быть равен типу свойства

Так что пытаясь сделать что-то вроде

val test : String?
    get() : String = "hi"

Не будет работать


Однако вы можете скрыть свойство nullable и предоставить необнуляемое свойство, которое ссылается на значение nullable посредством приведения:

private val test : String? = "hi"
val testNotNull : String = test as String

Если test ссылка null, будет сгенерировано исключение.

Например:

fun main(args: Array<String>) = print(Demo().testNotNull)

class Demo(private var test: String? = "hi") {
    val testNotNull : String
.       get() = test as String
}

Вы можете проверить этот фрагмент на https://try.kotlinlang.org/

Хотя это не безопасно. Вы должны переосмыслить свой дизайн. Если вы не взаимодействуете с Java, вы не должны наказывать себя обнуляемыми типами.

Я не думаю, что ты можешь. Что вы сделали с fun getData() это верный подход ИМО. Или вы можете просто не использовать класс данных и создать нормальный класс, очевидно.

Я думаю, что это может работать с чем-то вроде этого:

typealias notNullType = MyData

data class Test(private val _value: MyData? = null) {
    val v: notNullType = _value as notNullType
    get() { return field }
}

Это полностью позволит вам сделать:

fun play() {
    val t = Test(null)
    print(t.v) //see what I did? :-)
}

ЭТО СКАЗАЛ… Я не думаю, что "прячу" ? необязательно обязательно хорошая идея.

Это не обязательно означает, что класс MyData будет нулевым, если вы приведете его как MyData?

'?"Просто позволяет объекту быть нулевым в том случае, если он фактически становится нулевым, чтобы избежать исключения во время выполнения.

Вы можете сделать свой класс обнуляемым, и он все еще может содержать ваши данные.

Другие вопросы по тегам