'this'在此上下文中未定义

Ale*_*xey 5 kotlin

我该如何解决以下情况?

interface I
class A(i: I)
class C : I, A(this) // << --- 'this' is not defined in this context
Run Code Online (Sandbox Code Playgroud)

简而言之,我想将类实例传递给超类构造函数.
在Kotlin有可能吗?

PS 所有答案都很好,技术上也是正确的.但让我们举一个具体的例子:

interface Pilot {
   fun informAboutObstacle()
}

abstract class Car(private val pilot: Pilot) {
    fun drive() {
        while (true) {
            // ....
            if (haveObstacleDetected()) {
                pilot.informAboutObstacle()
            }
            // ....
        }
    }
    fun break() {
        // stop the car
    }
}

class AutopilotCar : Pilot, Car(this) { // For example, Tesla :)
    override fun informAboutObstacle() {
        break() // stop the car
    }
}
Run Code Online (Sandbox Code Playgroud)

这个例子看起来不太费力,为什么我不能用OOP友好的语言来实现呢?

Ing*_*gel 6

不,这在JVM上是不可能的.this仅在超类初始化后才可用.

https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.10.2.4

类myClass的实例初始化方法(第2.9.1节)将新的未初始化对象视为本地变量0中的此参数.在该方法调用myClass的另一个实例初始化方法或其直接超类之前,该方法的唯一操作是执行此操作是分配在myClass中声明的字段.

因此,在调用超类构造函数之前,禁止aload 0推送this堆栈的字节码指令.这就是为什么它不能作为参数传递给超级构造函数的原因.

Kotlin是作为JVM语言诞生的,旨在实现与Java代码的最大互操作性以及其语言功能的最小开销.虽然Kotlin可能选择以不同的方式编排对象初始化,但它会在混合的Java-Kotlin类层次结构中产生问题并增加显着的开销.