我期待看到输出
black
white
用下面的代码
package delegate
import kotlinx.coroutines.runBlocking
import kotlin.properties.ReadOnlyProperty
import kotlin.reflect.KProperty
open class Color(private val name: String) {
override fun toString(): String {
return name
}
}
class Black : Color("black")
class White : Color("white")
class ColorCollection {
private val black = Black()
private val white = White()
val list = listOf(black, white)
}
class Palette {
val black: Black by ColorDelegate()
val white: White by ColorDelegate()
val colorCollection = ColorCollection()
}
class ColorDelegate<T> : ReadOnlyProperty<Palette, T> {
override fun getValue(thisRef: Palette, property: KProperty<*>): T {
return thisRef.colorCollection.list.mapNotNull { it as? T }.first()
}
}
fun main() = runBlocking {
val palette = Palette()
println(palette.black)
println(palette.white)
}
但是,我只得到黑色输出,然后Exception in thread "main" java.lang.ClassCastException: delegate.Black cannot be cast to delegate.White
. 我发现通过这一行thisRef.colorCollection.list.mapNotNull { it as? T }
,我期望它只返回列表中可以安全地转换为泛型类型的值,否则返回 null。例如,当访问 Palette 中的黑色委托属性时,我应该只看到 1 返回的黑色元素thisRef.colorCollection.list.mapNotNull { it as? T }
,它实际上返回了两个(黑色和白色)。it as? T
不管 T 是什么,总能以某种方式工作。我还尝试在该行放置一个断点,尝试将“abcdef”设置为 T?,它也可以工作,我希望看到 String 无法转换为 Black 的转换异常......
这是一个错误...?