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