在此上下文中未定义“this”

2024-03-19

我该如何解决以下情况?

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(使用前将#替换为@)

在此上下文中未定义“this” 的相关文章

随机推荐

  • TreeSet 自定义比较器算法 .. 字符串比较

    从提供的输入字符串 200 400 7 1 100 0 1 1 200 200 3 1 0 400 11 1 407 308 5 1 100 600 9 1 我在 TreeSet 中添加相同的内容 并希望它按第三个元素顺序排序 因此预期输出
  • Mac Excel 2016 VBA - Workbook.open 出现 1004 错误

    我正在尝试让一个在 Excel 2011 for Mac 中完美运行的宏在 Excel 2016 for mac 中运行 目标是让用户指定一个包含 csv 文件的文件夹 然后宏循环遍历所有 csv 文件 打开每个文件将信息从其中复制到另一个
  • 钩子回调时状态不正确

    我正在使用 socket io 和 React hooks 编写一个聊天客户端 消息历史记录 chatMessages 时addMessage 收到消息事件后 调用不正确 始终为空数组 chatMessages确实更新 正确 但在下次调用时
  • 在 VBA (Microsoft Access) 中将标签的“Caption”属性的一部分加粗

    如何将 Microsoft Access 标签标题中的某个单词加粗 如果有帮助 文本本身将存储在 Microsoft Access 表中 下面是一个例子 我有一个带有标签的 Microsoft Access 表单 位于Form Load 事
  • 缓慢选择所有条目

    下面的 SELECT 与内部表一起运行GIT KUNNR TAB包含 2 291 000 条具有唯一客户 kunnr 的行 需要 16 分钟才能完成 select kunnr umsks umskz gjahr belnr buzei bs
  • 有没有办法知道文档何时已从缓存与数据库同步?

    我正在构建一个即时通讯应用程序 类似于WhatsApp 我需要显示消息的发送状态 正在发送 已发送 如果是 Firebase 缓存 由于处于离线状态 则发送 如果消息位于在线数据库上 则发送 有没有办法判断特定文档是否已上传到数据库 我目前
  • androidplot背景图像移位

    我尝试使用以下代码将图形网格的背景分为 3 个区域 int data 0xff000000 0x80008000 0xff000000 bgBitmap Bitmap createBitmap data 1 3 Bitmap Config
  • 如何在facebook SDK中分享视频?

    我编写了如下代码 其中文件存在于资源中 它不为空 我成功添加图像 但卡在视频上 void uploadVideo NSLog UPload Videio NSString filePath NSBundle mainBundle pathF
  • 数据库中的实体类...错误无效资源_pm

    我通过 phpMyAdmin 在 MySQL 中创建了数据库和表 我正在尝试使用数据库中的实体类将其连接到我的项目 但是 当我运行我的项目时 出现以下错误 Caused by com sun appserv connectors inter
  • Windows 7、R 3.0.2、插入符号 6.0-21 上插入符号中的 train() 出现致命错误

    我正在尝试使用train 插入符号以适应分类模型 但我遇到了某种未处理的异常 并且在 R 控制台中输出任何错误信息之前我的 R 会话崩溃了 Windows 错误 R for Windows 终端前端已停止工作 我正在运行 Windows 7
  • html表格中的MVC分页

    我有一个带有搜索按钮的搜索表单 当用户输入所有搜索输入字段并按下搜索按钮时 将仅返回同一页面中 html 表中的前 10 条记录 我已经做到了这一点 当用户按下下一页按钮时 我必须保留用户输入的值并将其发送到数据库并获取接下来的 10 条记
  • 在 Z3 中证明归纳事实

    我试图在 Microsoft 的 SMT 求解器 Z3 中证明一个归纳事实 我知道 Z3 一般不提供此功能 如Z3 guide http rise4fun com z3 tutorial guide 第 8 节 数据类型 但是当我们限制要证
  • 未捕获的语法错误:意外的标记:

    我正在 MooTools 脚本中运行 AJAX 调用 这在 Firefox 中工作正常 但在 Chrome 中我得到了Uncaught SyntaxError Unexpected token 错误 我无法确定原因 注释掉代码以确定错误代码
  • 传递多个参数来应用 (Python)

    我正在尝试清理 Python 中的一些代码以向量化一组功能 我想知道是否有一种好方法使用 apply 来传递多个参数 考虑以下内容 当前版本 def function 1 x if string in x return 1 else ret
  • Firebase事务api调用当前数据为空

    当我使用transaction 更新一个位置 该位置的数据是返回空值即使该位置有一些数据 I tried transaction 读取数据后在同一位置 它提供该位置的所有数据 我该如何使用transaction 如果情况像上面那样呢 事务以
  • PHP set_time_limit 抛出 500 错误?

    当我使用set time limit如果脚本运行时间超过 360 秒 则会抛出 500 错误 359 没什么 360及以上 错误 我无法访问 php ini 如何修复此错误 脚本运行时间超过 360 秒 就会抛出 500 错误 听起来你在某
  • Kafka消费者启动延迟汇合dotnet

    当启动 confluence dotnet Consumer 时 在调用订阅和后续轮询之后 似乎需要很长时间才能从服务器接收 分区已分配 事件 因此也需要很长时间 大约 10 15 秒 起初我以为存在自动创建主题的开销 但无论消费者的主题
  • 我应该如何设置集成测试以将测试数据库与实体框架结合使用?

    我正在为应用程序编写集成测试 但无法找到有关如何为我的集成套件设置测试数据库的任何最佳实践 我正在使用实体框架代码优先开发 ASP NET MVC4 应用程序 我可以确认我的测试项目中的测试默认与我的计算机上的本地开发数据库进行通信 这并不
  • Fortran 小数和千位分隔符

    有没有办法更改逗号的句点小数分隔符 另外 如何使输出数字具有千位分隔符 这可以是逗号 句号 空格 打开文件时使用参数 DECIMAL COMMA open 100 file logfile status unknown DECIMAL CO
  • 在此上下文中未定义“this”

    我该如何解决以下情况 interface I class A i I class C I A this lt lt this is not defined in this context 简而言之 我想将类实例传递给超类构造函数 在科特林中