Kotlin:合并的case语句,不允许访问成员变量

时间:2018-09-11 04:34:37

标签: kotlin

在我的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

1 个答案:

答案 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)
}