gpt4 book ai didi

kotlin - 方法没有被调用,没有错误,可能与泛型/伴随对象/继承/并发/内联有关

转载 作者:行者123 更新时间:2023-12-02 13:00:54 25 4
gpt4 key购买 nike

好的,所以我有一个名为 ChannelBase 的类,它是 Slack 中所有 channel 类型事物的父类(super class)(基本上只是 channel 和组,因为 MPIM 不再被视为组)

在 ChannelBase 中有一个 abstract class ChannelCompanion<T : BaseChannel<T>> (泛型是子类的类型,又名 ChannelGroup )。然后子类让它的伴生对象扩展 ChannelCompanion,这迫使它有一个 fromJson(JsonObject)函数,并为伴随对象提供 inline fun start(callback: () -> Unit)从 Slack API 收集 channel 列表并对其进行解析。

所以基本上这就是我们所拥有的,假设我们正在注册 Channel类(class)。
Channel.start { } (继承自 ChannelCompanion)被调用,这是应该发生的事情:

-> 调用 ChannelCompanion.start { }-> 异步向一个 Slack 团队的 channels.list 方法发出 HTTP 请求
-> 解析 JSON 并检索 Channel JsonObjects 数组
-> 使用 Channel.fromJson(JsonObject) 将每个 JsonObject 解析为 Channel 对象(ChannelCompanion 中的抽象乐趣)

问题是当 Channel.fromJson被调用,线程卡住。没有错误或异常,它只是卡住。如果你不理解它的结构(很难解释),这里是存储库:https://github.com/Deanveloper/SlaK/tree/master/src/main/kotlin/com/deanveloper/slak/channel

调试代码显示程序在Channel.fromJson时卡住叫做。第一行Channel.fromJson是打印该函数已运行,但不打印。不过,它被调用之前的行会被打印出来。不太确定这里发生了什么。

需要注意的是,虽然有多个线程,但在发出 HTTP 请求后,这些都在同一个线程中执行。

如果你想克隆存储库并自己测试,https://github.com/Deanveloper/SlaK .在 JUnit 测试目录中,转到 BaseTest 并将加密的 API key 替换为您自己的 Slack 团队的 API key

最佳答案

这是由内联引起的,因为 fromJson 函数具有 protected 范围。因为函数是内联的,所以 fromJson 函数实际上是从包外部调用的(因为 start 方法是从包外部调用的)。这导致了 IllegalAccessError。

关于kotlin - 方法没有被调用,没有错误,可能与泛型/伴随对象/继承/并发/内联有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37462810/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com