Tipo de elemento de testing de un contenedor en kotlin

Intento escribir algo de Kotlin wrapper sobre Android ShanetworkingPreferences y estoy teniendo este código ahora mismo:

class KPreferences(ctx: Context) { val prefs = ctx.getShanetworkingPreferences(ctx.getString(R.string.app_name), Context.MODE_PRIVATE) fun put(key: String, value: Any): Boolean { val editor = prefs.edit() when (value) { is Boolean -> editor.putBoolean(key, value) is Float -> editor.putFloat(key, value) is Int -> editor.putInt(key, value) is Long -> editor.putLong(key, value) is String -> editor.putString(key, value) is Set<*> -> editor.putStringSet(key, value as Set<String>) } return editor.commit() } 

Esto comstack, pero no puedo evitar search si no puedo mejorar esto asegurándome de que el set contiene solo cadenas y ningún otro tipo.

Intenté esto:

 fun put(key: String, value: Any): Boolean { val editor = prefs.edit() when (value) { is Boolean -> editor.putBoolean(key, value) is Float -> editor.putFloat(key, value) is Int -> editor.putInt(key, value) is Long -> editor.putLong(key, value) is String -> editor.putString(key, value) is Set<*> -> if (value.isEmpty() || value.iterator().next() is String) { editor.putStringSet(key, value as Set<String>) } } return editor.commit() } 

Pero parece tan poco elegante.

El otro enfoque sería definir

 fun put(key: String, value: Set<String>) 

y eliminar el último caso en mi bash. Me pregunto si me falta alguna solución elegante aquí.

¡Gracias!

En primer lugar, me gustaría señalar que la comprobación que tiene en el ejemplo puede no garantizarle que ponga un set de elementos que no sean cadenas en su editor: si la implementación del editor no copy el set al colocarlo, se podría pasar un set vacío y luego agregarle algo que no sea una cadena:

 val set = HashSet<Int>() prefs.put("...", set) // set is empty, the check lets it through set.add(1) 

La información de tipo genérico no se reifica, por lo que deberá introducir sobrecargas para cada tipo que admita: Boolean , Float , etc., y Set<String> , o ir a ninguna comprobación adecuada.

Ya hice una biblioteca similar y es estable. Puede usarlo si lo desea: KPreferences Utiliza un enfoque completamente similar.

  • Constructores de Kotlin: primarios y secundarios
  • ¿Cómo asignar un nuevo valor si configura el setter como privado en kotlin?
  • ¿Los methods de extensión y las properties de extensión son malas prácticas?
  • Uso dynamic de AnkoComponent <*>. StartActivity ()
  • Retrofit2 return null Unidad en kotlin para 204 Sin respuesta de contenido
  • ¿Cómo implementar la function genérica de Interface en Kotlin?
  • Seguridad de spring. Página de inicio de session multilenguaje basada en url
  • Validar files XML grandes contra grandes XSD, ¿hay alguna manera rápida de hacerlo?
  • Tokens inesperados (uso; para separar expresiones en la misma línea) en kotlin
  • ¿Cómo conseguir ARTE ALBUM de una canción de su path en kotlin?
  • cómo convertir a NotNull usando enum en Kotlin