Kotlin lambda以Interface作为参数
我对Koltin lambdas有点困惑,我想知道如何使用它,给出以下代码片段:
interface KotlinInterface { fun doStuff(str: String): String }
而需要这个接口的函数作为parameter passing:
fun kotlinInterfaceAsArgument(kotlinInterface: KotlinInterface): String{ return kotlinInterface.doStuff("This was passed to Kotlin Interface method") } fun main(args: Array){ val newString = kotlinInterfaceAsArgument({ str -> str + " | It's here" //error here (type mismatch) }) }
但是,Java中的相同逻辑按照预期编译和运行。
public class JavaClass { public String javaInterfaceAsArgument(JavaInterface javaInterface){ String passedToInterfaceMethod = "This was passed to Java Interface method"; return javaInterface.doStuff(passedToInterfaceMethod); } public interface JavaInterface { public String doStuff(String str); } }
和
public class Main { public static void main(String[] args) { JavaClass javaClass = new JavaClass(); String newValue = javaClass.javaInterfaceAsArgument(str -> str + " | It's here!"); System.out.println(newValue); } }
在这种情况下,我怎样才能在Kotlin中使用lambda?
SAM转换 (从1.1开始)只适用于Java接口,不适用于Kotlin。
另请注意,此function仅适用于Java interop; 由于Kotlin具有适当的函数types,函数自动转换为Kotlin接口的实现是不必要的,因此不受支持。
你可以通过一些方法来修复你的代码。
编辑:我意识到这是另一个问题的确切副本,即使错误是一样的。
纯Kotlin的正确方法是使用高阶函数: https : //kotlinlang.org/docs/reference/lambdas.html
使用高阶函数,您可以将函数作为parameter passing给函数。
如果我们谈谈你的例子:
fun kotlinFunctionAsArgument(kotlinFunction: (String) -> String): String { return kotlinFunction("This was passed to Kotlin Function method") } fun main(args: Array){ val newString = kotlinFunctionAsArgument({ str -> str + " | It's here" //there are no errors }) }