3

我有一个数据类

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

我想确保我的数据只有在它不为空时才能访问,否则抛出。我用下面的很好。

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

但是,如果我按照Override getter for Kotlin data class遵循指南,我需要返回以下投诉MyData?而不是MyData

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

field返回时不能强制转换为它的非空版本是真的吗?

4

3 回答 3

2

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

getter 返回类型必须等于属性的类型

所以尝试做类似的事情

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

行不通。


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

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 进行互操作,则不应使用可为空的类型来惩罚自己。

于 2017-07-11T01:30:35.133 回答
1

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

我认为它可能适用于这样的事情:

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

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

于 2017-07-11T02:08:45.083 回答
0

如果您将 MyData 类转换为MyData?

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

你可以让你的类可以为空,它仍然可以包含你的数据。

于 2017-07-11T01:29:40.487 回答