【问题标题】:Modifier 'override' is not applicable to 'local function' while converting java interface override method to kotlin将 java 接口覆盖方法转换为 kotlin 时,修饰符“覆盖”不适用于“本地函数”
【发布时间】:2021-06-25 12:58:01
【问题描述】:

我正在尝试将 java 函数转换为对应的 kotlin 函数,但我在 override fun binderDied() 得到了 Modifier 'override' is not applicable to 'local function'
这是java代码:

private void linkToDeath(IBinder service) {
    try {
        service.linkToDeath(new IBinder.DeathRecipient() {
            @Override
            public void binderDied() {
                Log.d(TAG, "======binderDied======");
                deviceServiceEngine = null;
                bindDeviceService();
            }
        }, 0);
    } catch (RemoteException e) {
        e.printStackTrace();
    }
}

还有 override fun binderDied() 抱怨的 kotlin 转换

private fun linkToDeath(service: IBinder) {
    try {
        service.linkToDeath(IBinder.DeathRecipient {
            override fun binderDied() {
                Log.d(TAG, "======binderDied======")
                deviceServiceEngine = null
                bindDeviceService()
            }
        }, 0)
    } catch (e: RemoteException) {
        e.printStackTrace();
    }
}

我在这里缺少什么?提前致谢。

【问题讨论】:

    标签: java android kotlin


    【解决方案1】:

    Java 版本具有接口的匿名类实现(我假设它是接口而不是类)。要在 Kotlin 中执行此操作,您需要在其前面加上 object:,如下所示:

    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();
        }
    }
    

    如果这个接口是函数式接口(只有一个抽象方法),那么你可以使用 lambda 语法代替匿名类:

    private fun linkToDeath(service: IBinder) {
        try {
            service.linkToDeath(IBinder.DeathRecipient {
                Log.d(TAG, "======binderDied======")
                deviceServiceEngine = null
                bindDeviceService()
            }, 0)
        } catch (e: RemoteException) {
            e.printStackTrace();
        }
    }
    

    您收到该错误是因为没有object:,您使用的是 lambda 语法,因此您的内部函数被解析为 lambda 函数中的本地定义函数。

    【讨论】:

      猜你喜欢
      • 2020-06-16
      • 1970-01-01
      • 1970-01-01
      • 2014-07-17
      • 2016-08-12
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      相关资源
      最近更新 更多