标签:actual 默认 参数 expect context 源代码
问题起因
runBlocking的context参数有默认值。但是在Android Studio中查看源代码,发现源代码中定义如下:
@Throws(InterruptedException::class)
public actual fun <T> runBlocking(context: CoroutineContext, block: suspend CoroutineScope.() -> T): T
这就很奇怪了。因为doc中明明注释称context参数具有默认值,而且官方文档给出的签名如下:
expect fun <T> runBlocking(context: CoroutineContext = EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T
并且Kotlin在Github仓库上的源代码也确实与IDE中一致。
而且实际调试时可以发现确实传入了默认参数。那么到底是怎么回事呢?
真相
经过了反编译、查看文档与仓库多次对照后,终于发现问题所在:
问题的关键在于expect
和actual
。初学者(比如我)可能会简单地不怎么注意函数签名的这一部分,然而正是这里造成了默认参数在源代码中令人困惑的现象!
由于expect定义处已经给出了默认参数,因此当调用到actual函数时,确实可以起到传入默认参数的作用。然而,令人十分困惑的是,在IDE中查找函数位置只能溯源到actual的函数而不是expect部分,因此很可能产生误解。
吃一堑长一智,以后再遇到类似地情况,请注意方法签名是否有actual!默认参数可能定义在expect部分中!另外,优先查看官方文档,IDE溯源代码可能产生误解。
标签:actual,默认,参数,expect,context,源代码 来源: https://www.cnblogs.com/MadDonkey/p/16163499.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。