一个字段可以转换为非null版本本身?
我有一个数据类
data class MyModel(private val _data: MyData? = null)
而且我想确保我的数据只有在不为空时才可以访问,否则抛出。 我使用下面这是很好的。
fun getData(): MyData { return checkNotNull(_data) { "data shouldn't be null" } }
但是,如果我按照Kotlin数据类的Override getter遵循指南,下面的投诉我需要返回MyData?
而不是MyData
val data = _data get(): MyData { return checkNotNull(field) { "data shouldn't be null" } }
是否真的返回时, field
不能转换为非空的版本?
如果你的目标是为一个Any?
声明一个getter Any?
返回一个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上测试这个snippit
虽然这不安全。 你应该重新考虑你的设计。 如果你不和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(tv) //see what I did? :-) }
那是说 …我不认为“隐藏”的?
可选是一个好主意。
如果你像MyData?
一样MyData?
,MyData类不一定是空的MyData?
' ? '只是允许对象在实际变为空的情况下为空,以避免在运行时发生异常。
您可以让您的课程可以为空,它仍然可以包含您的数据。