我正在将Java中的项目转换为Kotlin,而令我惊讶的是,该接口使Kotlin中的代码比Java中的代码重。
示例 :我想从MyFragment在MainActivity中设置onBackPressListener。
文件1:MainActivity,文件2:MyFragment,文件3:OnBackPressedListener(接口)
Java中的文件1,Kotlin中的文件2,Java中的文件3:
activity.setOnBackPressed { /* Do something */ }
Kotlin中的文件1,Kotlin中的文件2,Java中的文件3:
activity.setOnBackPressed(OnBackPressedListener { /* Do something */ })
Kotlin中的文件1,Kotlin中的文件2,Kotlin中的文件3:
activity.setOnBackPressed(object: OnBackPressedListener {
override fun onBackPressed() {
/* Do something */
}
})
是否可以在Kotlin中拥有3个文件并使用lambda设置侦听器?(要在Kotlin中获取更多代码,这真令人沮丧。)
谢谢
Lambda版本仅在Kotlin与Java互操作时才有效,因为SAM Conversions
请参阅官方文档。
另请注意,此功能仅适用于Java互操作。由于Kotlin具有适当的功能类型,因此不需要将功能自动转换为Kotlin接口的实现,因此不受支持。
因此,如果要使用lambda设置纯kotlin侦听器,则可以定义如下的listener
and setOnBackPressed
方法:
var listener: (() -> Unit)? = null
fun setOnBackPressed(l: () -> Unit) {
listener = l
}
然后通过以下方式调用它:
listener?.invoke()
主要内容:实例,实例,函数重写,实例Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现: interface MyInterface { fun bar() // 未实现 fun foo() { //已实现 // 可选的方法体 println("foo") } } 实现接口 一个类或者对象可以实现一个或多个接口。 class Child : MyInterface { overri
Kotlin 接口与 Java 8 类似,使用 interface 关键字定义接口,允许方法有默认实现:interface MyInterface { fun bar() // 未实现 fun foo() { //已实现 // 可选的方法体 println("foo") } } 实现接口 一个类或者对象可以实现一个或多个接口。class Child : MyInterface { override
用Java 8 lambdas到处乱搞。为什么当我向接口添加另一个方法时,这会给我一个错误: 不使用第二个方法也能正常工作:“public int getID(String name)
问题内容: Java 8引入了Lambda表达式和类型注释。 使用类型注释,可以定义Java注释,如下所示: 然后可以在任何类型引用上使用此注释,例如: 这是一个完整的示例,使用此批注打印“ Hello World”: 输出将是: 在Java 8中,还可以用lambda表达式替换此示例中的匿名类: 但是由于编译器会推断lambda表达式的Consumer类型参数,因此不再能够注释创建的Consum
Java8同时引入了Lambda表达式和类型注释。 可以将lambda表达式强制转换为使用者,然后注释强制转换表达式的类型引用: 但这不会产生所需的结果,因为创建的使用者类不会用强制转换表达式的批注进行批注。产出: 两个问题: 但是注释参数对lambda表达式不起作用: 有趣的是,当使用lambda表达式时,也不可能接收参数的名称(当使用javac-parameter编译时)。不过,我不确定这种行
问题内容: 相当于kotlin中的代码,我尝试执行的操作似乎无效: 在里面: 问题答案: 如果是Java,则可以使用SAM转换: 否则,如果界面是Kotlin … …您可以使用语法匿名实现它: