我该如何解决以下情况?
interface I
class A(i: I)
class C : I, A(this) // << --- 'this' is not defined in this context
简而言之,我想将类实例传递给超类构造函数。
在科特林中可能吗?
P.S.所有答案都很好并且技术上是正确的。但让我们举一个具体的例子:
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
}
}
这个例子看起来并不太做作,为什么我不能用OOP友好的语言来实现它呢?
不,这在 JVM 上是不可能的。this
仅在超类初始化后才可用。
From
https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.10.2.4 https://docs.oracle.com/javase/specs/jvms/se9/html/jvms-4.html#jvms-4.10.2.4
类 myClass 的实例初始化方法(第 2.9.1 节)将新的未初始化对象视为局部变量 0 中的 this 参数。在该方法调用 myClass 或其直接超类的另一个实例初始化方法之前,该方法可以执行的唯一操作对此执行的是分配 myClass 中声明的字段。
所以字节码指令aload 0
推动this
在调用超类构造函数之前,禁止在堆栈上进行操作。这就是为什么它不能作为参数传递给超级构造函数。
Kotlin 是作为 JVM 语言诞生的,旨在实现与 Java 代码的最大互操作性及其语言功能的最小开销。虽然 Kotlin 可以选择以不同的方式编排对象初始化,但这会在混合 Java-Kotlin 类层次结构中产生问题并增加大量开销。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)