我正在尝试设置未初始化的值,并尝试让以下内容正常运行。这主要是对具体化仿制药的力量(和局限性)的好奇心。
我试图为数据类的可选参数提供默认值。
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
包含is Type
条款时,Kotlin有智能投射。在这个例子中,智能强制转换没有开始,因此无法编译。
任何想要完成类似事情的想法?
答案 0 :(得分:7)
使用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)
}