方法不被调用,没有错误,也许与泛型/伴随对象/继承/并发/内联有关

好的,所以我有一个名为ChannelBase的类,它是Slack中所有通道类型的超类(基本上只是通道和组,因为MPIM不再被认为是组)

在ChannelBase中有一个abstract class ChannelCompanion<T : BaseChannel<T>> (泛型是子类的类型,又称ChannelGroup )。 然后,子类将其伴随对象扩展为ChannelCompanion,强制它具有fromJson(JsonObject)函数,并为伴随对象提供一个inline fun start(callback: () -> Unit) ,用于从Slack API收集频道列表并解析它。

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

– >拨打ChannelCompanion.start { }
– >将异步请求发送给一个懒散的小组的channels.list方法
– >解析JSON并检索Channel JsonObjects的数组
– >使用Channel.fromJson(JsonObject) (ChannelCompanion中的抽象乐趣Channel.fromJson(JsonObject)每个JsonObject解析为Channel对象Channel.fromJson(JsonObject)

问题是当Channel.fromJson被调用时,Thread冻结。 没有错误或例外,它只是冻结。 如果你不明白这个结构(这很难解释),这里是存储库: https : //github.com/Deanveloper/SlaK/tree/master/src/main/kotlin/com/deanveloper/slak/渠道

调试代码显示,调用Channel.fromJson时程序冻结。 Channel.fromJson的第一行是打印该函数运行,并不打印。 它被调用之前的行被打印,虽然。 不太确定这里发生了什么事情。

值得注意的是,虽然有多个线程,但是这些都是在HTTP请求完成后在同一个线程中执行的。

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

它是由内联引起的,因为Json的函数有一个受保护的范围。 因为函数是内联的,所以fromJson函数实际上是从包外部调用的(因为启动方法是从包外部调用的)。 这导致了一个IllegalAccessError。