Forma correcta de usar genérico reificado en Kotlin

Quiero reescribir la pequeña function de extensión para ShanetworkingPreferences . En este momento parece que esto

 fun ShanetworkingPreferences.put(arg: Pair<String, Any>) { val e = edit() val s = arg.second when (s) { is Int -> e.putInt(arg.first, s) is String -> e.putString(arg.first, s) is Boolean -> e.putBoolean(arg.first, s) is Long -> e.putLong(arg.first, s) else -> throw NotImplementedError("Extension not implemented for this type") } e.apply() } 

¿Hay alguna forma idiomática de usar genérico con when ?

Mi primera suposition es

 inline fun <reified T> ShanetworkingPreferences.put(arg: Pair<String, T>) { val e = edit() when (T::class) { Int::class -> e.putInt(arg.first, arg.second as Int) String::class -> e.putString(arg.first, arg.second as String) Boolean::class -> e.putBoolean(arg.first, arg.second as Boolean) Long::class -> e.putLong(arg.first, arg.second as Long) else -> throw NotImplementedError("Extension not implemented for this type") } e.apply() } 

Pero se ve un poco espeluznante y no funciona

Si desea evitar la indicación de when , puede crear sobrecargas para cada tipo:

 inline fun ShanetworkingPreferences.put(arg: Pair<String, Int>) { edit().putInt(arg.first, arg.second).apply() } inline fun ShanetworkingPreferences.put(arg: Pair<String, String>) { edit().putString(arg.first, arg.second).apply() } inline fun ShanetworkingPreferences.put(arg: Pair<String, Boolean>) { edit().putBoolean(arg.first, arg.second).apply() } inline fun ShanetworkingPreferences.put(arg: Pair<String, Long>) { edit().putLong(arg.first, arg.second).apply() } 

Su primera versión es la correcta e idiomática. Kotlin tiene yeso inteligente, por lo que tiene is Int -> e.putInt(arg.first, s) lugar de is Int -> e.putInt(arg.first, s as Int) . Eso es todo lo que Kotlin puede hacer por usted.

  • ¿Cómo henetworkingo la documentation de KDoc?
  • ¿Puede un parámetro de tipo covariante estar en una position de input en el constructor?
  • asignar variable solo si es nulo
  • Notificación Acción no disparando PendingIntent
  • Estoy tratando de reproducir música desde SDcard
  • Usando Moshi con múltiples campos de input
  • ¿Por qué enlazar objects de búfer de OpenGL?
  • Cómo implementar lateinit correctamente con objects de class personalizados para usar en onCreate () en Android evitando el error 'Property getter or setter expected'
  • Invierte el order de las palabras en una cadena en Kotlin
  • Usando RxJava para unir datos locales con datos remotos (o en caching)
  • ¿Cómo podemos usar Dagger2 con kotlin?