【问题标题】:Type of "this" inside coroutine协程中“this”的类型
【发布时间】:2021-06-25 13:47:10
【问题描述】:
我有功能:
fun buttonClick(view: View){
CoroutineScope(Dispatchers.Default).launch{ //this:CoroutineScope
Log.i(TAG,"${this.javaClass.toString()}")
while (this.isActive) {
//...
}
}
}
在 Logcat 中我看到:class kotlinx.coroutines.StandaloneCoroutine。但是如果我在调试时进入while (this.isActive),我会看到CoroutineScope.isActive 的调用——而不是StandaloneCoroutine(或AbstractCoroutine)方法的调用。即“this”具有 CoroutineScope 类型——不是 StandaloneCoroutine。谁能解释一下“this”的这种行为?
【问题讨论】:
标签:
kotlin
kotlin-coroutines
coroutine
【解决方案1】:
StandaloneCoroutine 是所有这些的子类型:Job、JobSupport、Continuation 和 CoroutineScope。
另一方面,isActive 是CoroutineScope 的扩展属性。扩展属性/函数不属于类型,这是它们的基本特征。不管你有哪个CoroutineScope 的实现,扩展属性的实现总是唯一的public val CoroutineScope.isActive: Boolean,IDE 把你带到了那里。
您可能已经被这个扩展属性声明在文件CoroutineScope.kt 中的事实所抛弃,但是如果您仔细检查,您会发现它是顶级声明,它不在CoroutineScope 接口内(这只是一个单行)。
【解决方案2】:
当您在 IDE 中检查代码时,this 仅在其周围代码的上下文中被认为是 CoroutineScope。编译器只知道this 是一个CoroutineScope,因为这是launch() 中定义的类型。在这种情况下,CoroutineScope 的实际实例恰好是一个 StandaloneCoroutine 实例,它实现了 CoroutineScope 的接口。 StandaloneCoroutine 是一个私有实现细节,您只能在运行时使用反射检查它(就像您使用 javaclass 所做的那样)。