在Kotlin中使用泛化generics的正确方法
我想重写SharedPreferences
小扩展函数。 现在看起来像这样
fun SharedPreferences.put(arg: Pair) { 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() }
是否有什么惯用的方式来使用generics?
我的第一个猜测是
inline fun SharedPreferences.put(arg: Pair) { 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() }
但它看起来有点令人毛骨悚然,并没有工作
如果你想避免when
-statement,你可以为每个types创建重载:
inline fun SharedPreferences.put(arg: Pair) { edit().putInt(arg.first, arg.second).apply() } inline fun SharedPreferences.put(arg: Pair) { edit().putString(arg.first, arg.second).apply() } inline fun SharedPreferences.put(arg: Pair) { edit().putBoolean(arg.first, arg.second).apply() } inline fun SharedPreferences.put(arg: Pair) { edit().putLong(arg.first, arg.second).apply() }
你的第一个版本是正确和惯用的方式。 Kotlin有聪明的转换,所以你有is Int -> e.putInt(arg.first, s)
而不是is Int -> e.putInt(arg.first, s as Int)
。 这就是所有的科林可以为你做的。