我有以下类层次结构
open class B {
fun b() = this
}
open class C : B() {
fun c() = 0
}
我想做这样的事情:
fun test(c: C) {
c.b().c() // error: c.b() returns B, not C
}
我理解为什么会遇到这样的问题exists in Java,但Kotlin有聪明的演员阵容,那么为什么编译器在这种情况下不能聪明地将c.b()
投射到C
?
在Kotlin中是否有任何变通方法better than the Java ones使链接调用能够正确地继承?
答案 0 :(得分:8)
此处不适用智能广播,因为编译器无法理解B#b()
返回C
的实例。
返回的B
实例是C
的事实对于我们人类来说是显而易见的,但只有在我们看到该方法的实现之后。类型推断只能用于函数签名,所以它只能看到fun b(): B = ...
针对您的案例的简单解决方案是使b()
成为通用扩展程序:
open class B
fun <T: B> T.b() = this
open class C : B() {
fun c() = 0
}