在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) 。 这就是所有的科林可以为你做的。