考虑以下片段
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())
}