Kotlin实体types参数不智能投射
我正在试验设置未初始化的值,并试图让以下工作。 这主要是对物化仿制的权力(和限制)的好奇心。
我试图为数据类的可选参数提供默认值。
inline fun 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
检查其types或与null
进行比较。 在你的例子中,没有你检查types的具体对象,没有什么可以应用到智能转换。
但是,您可以将手动演员应用到T
,这将按预期工作。 下面是你的示例函数的一个工作版本,更新来处理Kotlinreflection库的特性,这个特性将在1.1中得到修复:
inline fun 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) { val t = Thing() println(t.id) }