一个字段可以转换为非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?

' '只是允许对象在实际变为空的情况下为空,以避免在运行时发生异常。

您可以让您的课程可以为空,它仍然可以包含您的数据。