在我的when
语句中,我们有3个案例正在执行类似的操作。
private fun bindValue(target: Activity) {
val declaredFields = target::class.java.declaredFields
for (field in declaredFields) {
for (annotation in field.annotations) {
when(annotation) {
is ReflectSource -> {
field.isAccessible = true
field.set(target, annotation.value)
}
is ReflectBinary -> {
field.isAccessible = true
field.set(target, annotation.value)
}
is ReflectRuntime -> {
field.isAccessible = true
field.set(target, annotation.value)
}
}
}
}
}
所以我想到了合并它们,如下所示
private fun bindValue(target: Activity) {
val declaredFields = target::class.java.declaredFields
for (field in declaredFields) {
for (annotation in field.annotations) {
when(annotation) {
is ReflectSource, is ReflectBinary, is ReflectRuntime -> {
field.isAccessible = true
field.set(target, annotation.value)
}
}
}
}
}
但是,它错误地指出value
的{{1}}是不可访问的。为什么?我不能合并这三个案例陈述吗?
更新 我的三个班级如下
annotation
答案 0 :(得分:2)
我不能合并这三个案例陈述吗?
不,您不能。记住
的工作方式is ReflectSource -> {
field.isAccessible = true
field.set(target, annotation.value)
}
情况:annotation.value
隐藏了编译器插入的强制转换,实际上是(annotation as ReflectSource).value
。
使用is ReflectSource, is ReflectBinary, is ReflectRuntime
时编译器应将哪个类插入强制转换?
原则上,编译器可以处理此问题,但是在极少数情况下,它将使语言描述和实现复杂化。
减少重复的一种选择是
val value = when(annotation) {
is ReflectSource -> annotation.value
is ReflectBinary -> annotation.value
is ReflectRuntime -> annotation.value
else -> null
}
value?.let {
field.isAccessible = true
field.set(target, it)
}