Kotlin reified类型参数没有智能投射

Jas*_*ger 7 generics inline reification kotlin

我正在尝试设置未初始化的值,并试图让以下工作.这主要是对具体化仿制药的力量(和局限性)的好奇心.

我试图为数据类的可选参数提供默认值.

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...
)
Run Code Online (Sandbox Code Playgroud)

when包括is Type条款时,Kotlin有聪明的铸造.在这个例子中,智能强制转换没有开始,所以这不会编译.

有什么想法来完成类似的事情?

yol*_*ole 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)
}
Run Code Online (Sandbox Code Playgroud)