可以将字段转换为自身的非空版本吗?

Can a field be cast to non null version of itself?

我有一个数据class

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

而且我想确保我的数据只有在不为空时才可以访问,否则抛出。 我用下面那个不错。

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

但是,如果我按照 的指南进行操作,我需要 return MyData? 而不是 MyData

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

当 return 时 field 不能转换为它的 Non-null 版本是真的吗?

如果像 MyData?

那样转换它并不一定意味着 MyData class 为空

'?'只是让对象在实际变为null的实例中为null,以避免在运行时出现异常。

您可以让您的 class 可以为 null,它仍然可以包含您的数据。

如果您的目标是为 Any? 属性 和 returns 和 Any 声明 getter,这是不可能的。您将收到以下错误:

Getter return type must be equal to the type of the property

所以尝试做类似

的事情
val test : String?
    get() : String = "hi"

不行。


但是,您可以隐藏可为 null 的 属性 并公开一个不可为 null 的 属性,它通过强制转换引用可为 null 的值:

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
}

您可以在 try.kotlin.org

测试这个片段

虽然这样不安全。你应该重新考虑你的设计。如果您不与 Java 互操作,则不应使用可空类型来惩罚自己。

我认为你做不到。您对 fun getData() 所做的是 IMO 的有效方法。或者你可以不使用数据 class 而创建一个普通的 class,显然。

我认为它可能适用于这样的东西:

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? :-)
}

话虽这么说……我不认为“隐藏”? 可选项一定是个好主意。