链式调用和继承

Chained calls and inheritance

我有以下 class 层次结构

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 可以使链式调用与继承一起正常工作?

智能转换在这里不适用,因为编译器无法理解 B#b() returns C.

的实例

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

针对您的情况的一个简单解决方案是将 b() 设为通用扩展名:

open class B 

fun <T: B> T.b() = this

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