链接调用和继承

我有一个类的层次结构

open class B { fun b() = this } open class C : B() { fun c() = 0 } 

我想要做这样的事情:

 fun test(c: C) { cb().c() // error: cb() returns B, not C } 

我明白为什么在Java中存在这样的问题,但Kotlin有聪明的转换,那么为什么在这种情况下编译器不能智能地将cb()C呢?

有没有什么比 Kotlin中的Java更好的解决方法使链接调用继承正确工作?

智能转换不适用于此,因为编译器无法理解B#b()返回C一个实例。

返回的B实例是C的事实对于我们人类来说是显而易见的,但是只有在我们看到方法的实现之后。 类型推理只能用于函数签名,所以它看起来很fun b(): B = ...

你的情况一个简单的解决方案将是b()一个通用的扩展:

 open class B fun <T: B> Tb() = this open class C : B() { fun c() = 0 }