【问题标题】: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 是所有这些的子类型:JobJobSupportContinuationCoroutineScope

    另一方面,isActiveCoroutineScope 的扩展属性。扩展属性/函数不属于类型,这是它们的基本特征。不管你有哪个CoroutineScope 的实现,扩展属性的实现总是唯一的public val CoroutineScope.isActive: Boolean,IDE 把你带到了那里。

    您可能已经被这个扩展属性声明在文件CoroutineScope.kt 中的事实所抛弃,但是如果您仔细检查,您会发现它是顶级声明,它不在CoroutineScope 接口内(这只是一个单行)。

    【讨论】:

      【解决方案2】:

      当您在 IDE 中检查代码时,this 仅在其周围代码的上下文中被认为是 CoroutineScope。编译器只知道this 是一个CoroutineScope,因为这是launch() 中定义的类型。在这种情况下,CoroutineScope 的实际实例恰好是一个 StandaloneCoroutine 实例,它实现了 CoroutineScope 的接口。 StandaloneCoroutine 是一个私有实现细节,您只能在运行时使用反射检查它(就像您使用 javaclass 所做的那样)。

      【讨论】:

        猜你喜欢
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 2020-10-09
        • 2011-11-06
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多