如何在带接收者的作用域中调用同名普通函数而非泛型扩展函数?
如何在有接收者的作用域中调用同名普通函数而非泛型扩展函数?
当作用域内存在接收者时,同名的泛型扩展函数会被优先匹配调用,要调用顶层普通函数可以通过以下几种方式解决:
方案1:使用顶层作用域限定符调用
如果普通函数是顶层函数(无类/对象包裹),可以通过this@<文件名>明确指定调用顶层作用域的函数,示例如下:
fun func() { println("Huge success!") } fun <T> T.func() { println("Complete failure!") } object GivenScope fun main() { GivenScope.run { // this: GivenScope // 明确调用顶层的func() this@Main.func() } }
注:这里的Main是当前Kotlin文件的文件名(不含.kt后缀),请根据实际文件名替换。
方案2:使用函数引用调用
通过函数引用::func结合invoke()方法,可绕过接收者直接调用普通函数:
fun main() { GivenScope.run { ::func.invoke() } }
方案3:封装普通函数到单例对象(重构方案)
如果不想依赖文件名限定,可将普通函数封装到单例对象中,通过对象名直接调用,从根源避免命名冲突:
object Utils { fun func() { println("Huge success!") } } fun <T> T.func() { println("Complete failure!") } object GivenScope fun main() { GivenScope.run { Utils.func() } }
内容的提问来源于stack exchange,提问作者Arthur Khazbulatov
相关产品推荐
相关产品推荐

