Kotlin委托类调用接口内扩展函数出现未解析引用错误
问题原因
接口中定义的扩展函数不属于接口的成员函数,Kotlin的委托实现(by关键字)只会继承接口的成员函数,不会处理接口内部定义的扩展函数。
- Login类内部能调用
logout(),是因为在类作用域内,扩展函数Login.logout()的接收者默认是当前this(Login实例),且该扩展函数在ILoginExt的作用域中可见。 - main函数中直接调用
login.logout()时,编译器找不到这个函数——因为扩展函数没有被委托机制添加到Login类的公共API中,也不是顶层可见的扩展函数。
解决方案
提供两种简洁可行的修复方式:
方式一:将扩展函数改为接口成员函数
把接口内的扩展函数替换为普通成员函数,让委托机制能正常继承该函数:
fun main() { val login = Login() login.login() login.callLogOut() login.logout() // 现在可正常调用 } class Login: ILoginExt by LoginExt() { fun callLogOut() { logout() } } interface ILoginExt { fun login() { println("ILoginExt -> login() called") } // 改为普通成员函数,委托机制可继承 fun logout() { println("ILoginExt -> logout() called") } } class LoginExt() : ILoginExt
方式二:将扩展函数移到顶层作用域
把扩展函数从接口内部移出,作为顶层函数,使其全局可见:
// 顶层扩展函数,全局作用域可访问 fun Login.logout() { println("ILoginExt -> logout() called") } fun main() { val login = Login() login.login() login.callLogOut() login.logout() // 正常调用 } class Login: ILoginExt by LoginExt() { fun callLogOut() { logout() } } interface ILoginExt { fun login() { println("ILoginExt -> login() called") } } class LoginExt() : ILoginExt
补充方案(冗余但符合原始结构)
如果一定要保留接口内的扩展函数定义,可在Login类中显式暴露该函数:
fun main() { val login = Login() login.login() login.callLogOut() login.logout() // 正常调用 } class Login: ILoginExt by LoginExt() { fun callLogOut() { logout() } // 显式声明函数,内部调用接口定义的扩展函数 fun logout() { this.logout() } } interface ILoginExt { fun login() { println("ILoginExt -> login() called") } fun Login.logout() { println("ILoginExt -> logout() called") } } class LoginExt() : ILoginExt
内容的提问来源于stack exchange,提问作者JEGADEESAN S
相关产品推荐
相关产品推荐

