链式调用和继承
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
}
我有以下 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
}