链式调用和继承

时间:2016-02-16 12:02:21

标签: kotlin

我有以下类层次结构

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使链接调用能够正确地继承?

1 个答案:

答案 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
}