我有一个以下的类层次结构
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在这种情况呢?
智能强制转换在这里不适用,因为编译器无法理解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)
| 归档时间: |
|
| 查看次数: |
303 次 |
| 最近记录: |