可以将字段转换为自身的非空版本吗?
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? :-)
}
话虽这么说……我不认为“隐藏”?
可选项一定是个好主意。
我有一个数据class
data class MyModel(private val _data: MyData? = null)
而且我想确保我的数据只有在不为空时才可以访问,否则抛出。 我用下面那个不错。
fun getData(): MyData {
return checkNotNull(_data) { "data shouldn't be null" }
}
但是,如果我按照 MyData?
而不是 MyData
val data = _data
get(): MyData {
return checkNotNull(field) { "data shouldn't be null" }
}
当 return 时 field
不能转换为它的 Non-null 版本是真的吗?
如果像 MyData?
'?'只是让对象在实际变为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? :-)
}
话虽这么说……我不认为“隐藏”?
可选项一定是个好主意。