You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在带接收者的作用域中调用同名普通函数而非泛型扩展函数?

如何在有接收者的作用域中调用同名普通函数而非泛型扩展函数?

当作用域内存在接收者时,同名的泛型扩展函数会被优先匹配调用,要调用顶层普通函数可以通过以下几种方式解决:

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 00:44:51