Java接口重写方法转Kotlin时override不适用于本地函数如何解决
错误原因
- 你混淆了Kotlin的SAM(单抽象方法)转换语法和匿名内部类实现语法:
IBinder.DeathRecipient { ... }属于SAM转换写法,大括号内默认对应binderDied()方法的实现逻辑,不需要再额外声明方法。你在大括号内定义override fun binderDied()相当于在Lambda内部创建了一个本地函数,本地函数不属于类成员,自然不能使用override修饰符,所以触发了对应的报错。
修正方案
有两种合法写法可以选择:
写法1:使用SAM转换(推荐,更简洁)
直接删除方法声明,只保留方法内部的逻辑代码即可:
private fun linkToDeath(service: IBinder) { try { service.linkToDeath(IBinder.DeathRecipient { Log.d(TAG, "======binderDied======") deviceServiceEngine = null bindDeviceService() }, 0) } catch (e: RemoteException) { e.printStackTrace() } }
写法2:显式声明匿名内部类
如果需要明确写出接口实现的结构,可以使用Kotlin匿名内部类的标准语法object : 接口名,这种写法下可以正常override接口方法:
private fun linkToDeath(service: IBinder) { try { service.linkToDeath(object : IBinder.DeathRecipient { override fun binderDied() { Log.d(TAG, "======binderDied======") deviceServiceEngine = null bindDeviceService() } }, 0) } catch (e: RemoteException) { e.printStackTrace() } }
内容的提问来源于stack exchange,提问作者Philip Kalela
相关产品推荐
相关产品推荐

