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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 05:36:05