El parámetro de tipo reificado Kotlin no arroja inteligentemente

Estaba experimentando con la configuration de valores no inicializados y estaba tratando de hacer funcionar lo siguiente. Esto es principalmente una curiosidad sobre el poder (y las limitaciones) de los generics reificados.

Estaba intentando proporcionar valores pnetworkingeterminados para los parameters opcionales de las classs de datos.

inline fun <reified T> uninitialized(): T = when (T::class) { Long::class -> -1L // Type mismatch. Requinetworking: T Found: Long String::class -> "" // Type mismatch. Requinetworking: 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... ) 

Cuando when incluye cláusulas is Type , Kotlin tiene un casting inteligente . En este ejemplo, el lanzamiento inteligente no se inicia, por lo que no se comstackrá.

Alguna idea para lograr algo similar?

    Una aplicación inteligente se aplica a un object específico después de usar para verificar su tipo o compararlo con null . En su ejemplo, no hay ningún object específico para el que compruebe el tipo, y no hay nada para aplicar el molde inteligente.

    Sin embargo, puede aplicar moldes manuales a T , que funcionará como se esperaba. Aquí hay una versión de trabajo de su function de muestra, actualizada para manejar las peculiaridades de la biblioteca de reflexión de Kotlin que se corregirá en 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) }