在kotlin中测试容器的项目类型

我正在尝试围绕Android SharedPreferences编写一些Kotlin包装,现在我有这个代码:

class KPreferences(ctx: Context) { val prefs = ctx.getSharedPreferences(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() } 

这编译,但我不能帮助搜索,如果我不能确保该集只包含字符串,没有其他类型不能更好。

我试过这个:

 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() } 

但看起来很不雅。

另一种方法是定义

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

并在我的尝试中删除最后一个案例。 我只是想知道如果我在这里错过任何优雅的解决方案。

谢谢!

首先,我想要注意的是,你在例子中的检查可能不能保证你把一些字符串以外的东西放到你的编辑器中:如果编辑器实现没有复制集合,就可以通过一个空集,然后再添加一个字符串以外的东西:

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

泛型类型信息没有被通用化,所以你需要为你支持的每一种类型引入重载: BooleanFloat等, Set<String> ,或者根本没有进行适当的检查

我已经做了一个类似的库,它是稳定的。 你可以使用它: KPreferences它使用了一个完全相似的方法。