Kotlin类型引用在when情况下



考虑以下片段

when(value){
Int-> FirebaseCrashlytics.getInstance().setCustomKey(key, value as Int)
Long-> FirebaseCrashlytics.getInstance().setCustomKey(key, value as Long)
Float-> FirebaseCrashlytics.getInstance().setCustomKey(key, value as Float)
Double-> FirebaseCrashlytics.getInstance().setCustomKey(key, value as Double)
else -> FirebaseCrashlytics.getInstance().setCustomKey(key, value.toString())
}

我想在when的情况下以某种方式引用类型,这样我就可以做一些类似的事情

when(value){
Int, Long, Float, Double -> FirebaseCrashlytics.getInstance().setCustomKey(key, value as type)
else -> FirebaseCrashlytics.getInstance().setCustomKey(key, value.toString())
}

在科特林有可能吗?如果没有,请提交功能请求;p

您可以通过反射获得value的运行时类型和相关的方法重载:

val crashlytics =  FirebaseCrashlytics.getInstance()
when (value) {
is Int, is Long, is Float, is Double -> crashlytics::class.declaredMemberFunctions
.single { it.name == "setCustomKey" && it.parameters[2].type.jvmErasure == value::class }
.call(crashlytics, key, value)
else -> crashlytics.setCustomKey(key, value.toString())
}

它将只有2个分支,但也有一定的性能损失(和放松的类型安全性(,所以我建议坚持原来的方法:

when(value) {
is Int-> FirebaseCrashlytics.getInstance().setCustomKey(key, value)
is Long-> FirebaseCrashlytics.getInstance().setCustomKey(key, value)
is Float-> FirebaseCrashlytics.getInstance().setCustomKey(key, value)
is Double-> FirebaseCrashlytics.getInstance().setCustomKey(key, value)
else -> FirebaseCrashlytics.getInstance().setCustomKey(key, value.toString())
}

最新更新