当前位置: 首页 > 知识库问答 >
问题:

将java接口重写方法转换为kotlin时,修饰符“override”不适用于“本地函数”

齐鸿光
2023-03-14
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();
    }
}
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();
    }
}

共有1个答案

贺宜修
2023-03-14

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函数中的本地定义函数。

 类似资料:
  • 本文向大家介绍Java接口中的修饰符,包括了Java接口中的修饰符的使用技巧和注意事项,需要的朋友参考一下 示例 《 Oracle Java样式指南》指出: 当修饰符是隐式的时,不应将它们写出来。 (有关上下文和指向实际Oracle文档的链接,请参见Oracle Official Code Standard中的修饰符。) 此样式指南特别适用于界面。让我们考虑以下代码片段: 变数 所有接口变量都是具

  • 我正在尝试为一个小测验应用程序编写代码。当你点击加号按钮时,它会将你带到一个单独的页面,在那里你可以输入问题和答案。当您单击“检查”按钮时,它会将您带回到上一页,并创建一个新按钮,其中文本设置为问题。当我试图在buttonclick事件下设置覆盖时,遇到了一个错误。有什么我可以解决的吗? 新网页: 问题页:

  • 问题内容: 有没有理由可以更改覆盖方法的访问修饰符?例如, 然后将package-private访问修饰符更改为, 我只是出于好奇而问这个问题。 问题答案: Java不允许您对access修饰符进行 更严格的限制 ,因为这会违反以下规则:子类实例应该可以代替超类实例使用。但是当涉及到 减少 访问限制时……好吧,也许超类是由另一个人编写的,他们没有想到您要使用其类的方式。 人们编写的程序以及编程时所

  • 问题内容: 但是那里给出的解决方案不起作用。他们说我需要采取以下行动: 在项目结构中| 在“项目”对话框中,在界面中将“项目语言级别”更改为6.0-@Override。 但是,目前项目语言级别是6.0,但是我仍然看到错误。 维克(Vic),这是一个窗口,并且在语言级(Language level)下没有JVM版本(不幸的是,由于我有10个信誉,所以我无法发布图像) 问题答案: 如果您的项目有多个模

  • 有谁能帮我把Android Studio中的Kotlin代码转换成Java吗? 我经历了以下过程: 工具>>Kotlin>>将Kotlin反编译为Java

  • 问题内容: 我正在编写一些代码,并且我需要它来捕获参数并将它们传递给 我(我想要它的默认行为,编写由空格分隔并后跟换行符的参数)。但是它需要而返回。 这是代码示例: 这将返回以下错误: 这是一个错误吗?不应该接受 任何 数组吗?顺便说一句,我也尝试这样做: 但出现以下错误: 有“解决方案”解决方法吗? 问题答案: 这不是错误。需要一个类型。这意味着它必须是值的切片,而不是“任何切片”。为了转换切片

  • 有一个带有一些功能的接口。基类实现接口。然后在子类中重写函数。 但是@override给出了编译器错误“方法不从其超类重写方法” 问题:在子类中,如何覆盖基类中实现的接口函数? }

  • 我正在编写代码以匹配给定字符串或行的方法声明。这就是我的问题所在。当试图匹配修饰符时,当声明 工作。我一直都是这样 这就是我的问题。两者有什么区别,所有修饰符都一样吗?我相信这是有原因的,松散的顺序不是设计决定。 哦,如果有人知道匹配给定字符串的方法的最佳方法,请告诉我。谢谢。现在我正在使用正则表达式。