Kotlin脚本运行报扩展方法同时是成员和扩展错误如何解决
错误根因
这个报错是Kotlin脚本(.kts)的顶层扩展函数方法引用的特有兼容性问题,和普通Kotlin工程的编译逻辑差异有关:
普通Kotlin代码编译时,顶层扩展函数的签名是唯一确定的,方法引用String::getNameAndVersion可以被正常识别。但Kotlin脚本的顶层作用域处理逻辑不同,你定义的顶层String扩展函数getNameAndVersion会被编译器同时识别为脚本实例的成员函数和String类型的扩展函数,两种签名冲突,编译器无法匹配到正确的引用,就抛出了该错误。
解决方案
以下三种方案都可以解决问题,推荐优先选第一种,改动最小:
- 方案1:替换方法引用为Lambda调用
直接把报错行的方法引用替换为显式Lambda调用即可,不需要修改其他逻辑:// 原来的写法 // val envApiNameMap = envMap.mapValues { it.value.associate(String::getNameAndVersion) } // 替换后的写法 val envApiNameMap = envMap.mapValues { it.value.associate { str -> str.getNameAndVersion() } } - 方案2:将扩展函数移入内部单例类定义
把扩展函数放到脚本内的object单例中,避免顶层作用域的签名冲突:object Ext { fun String.getNameAndVersion() = substringBefore(':') to substringAfter(':') } // 引用时使用单例类的方法引用即可 val envApiNameMap = envMap.mapValues { it.value.associate(Ext::getNameAndVersion) } - 方案3:升级Kotlin编译器版本
该问题已经在Kotlin 1.7.20及更高版本中修复,如果可以调整编译环境,直接升级kotlinc到对应版本即可,不需要修改代码。
内容的提问来源于stack exchange,提问作者Richie
相关产品推荐
相关产品推荐

