链式调用和继承

net*_*men 3 kotlin

我有一个以下的类层次结构

open class B {
    fun b() = this
}

open class C : B() {
    fun c() = 0
}
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情:

fun test(c: C) {
    c.b().c() // error: c.b() returns B, not C
}
Run Code Online (Sandbox Code Playgroud)

我明白为什么这样的问题在Java中存在,但科特林具有智能管型,那么为什么编译器可以不聪明投c.b()C在这种情况呢?

有没有 Kotlin中的Java更好的解决方法来使链接调用与继承一起正常工作?

vod*_*dan 8

智能强制转换在这里不适用,因为编译器无法理解B#b()返回的实例C.

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

您的案例的简单解决方案是制作b()通用扩展:

open class B 

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

open class C : B() {
    fun c() = 0
}
Run Code Online (Sandbox Code Playgroud)