我正在尝试设置未初始化的值,并试图让以下内容发挥作用。这主要是对具体化泛型的力量(和局限性)的好奇。
我试图为数据类的可选参数提供默认值。
inline fun <reified T> uninitialized(): T = when (T::class) {
Long::class -> -1L // Type mismatch. Required: T Found: Long
String::class -> "" // Type mismatch. Required: T Found: String
// and so on...
else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class)
}
data class Thing(
var id: Long = uninitialized(),
var name: String = uninitialized() // and so on...
)
When when
包括is Type
子句,Kotlin 有智能铸造。在此示例中,智能转换未启动,因此无法编译。
有什么想法可以完成类似的事情吗?
使用后,智能转换将应用于特定对象is
检查其类型或将其与null
。在您的示例中,没有要检查类型的特定对象,也没有要应用智能转换的对象。
但是,您可以应用手动转换T
,它将按预期工作。这是示例函数的工作版本,已更新以处理 Kotlin 反射库的特殊性,该特殊性将在 1.1 中修复:
inline fun <reified T : Any> uninitialized(): T = when (T::class.java) {
Long::class.javaPrimitiveType, Long::class.javaObjectType -> -1L as T
String::class.java -> "" as T
// and so on...
else -> throw UnsupportedOperationException("No uninitialized value defined for " + T::class)
}
data class Thing(
var id: Long = uninitialized(),
var name: String = uninitialized() // and so on...
)
fun main(args: Array<String>) {
val t = Thing()
println(t.id)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)