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... ) 

当包括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) }