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.