Kotlin中传递方法引用给函数?Java写法不编译的解决方法
在Kotlin中传递Java类方法引用的解决办法
咱们先把场景具体化,假设你的Java类A长这样:
public class A { // 带参数的实例方法 public void method7(String input) { System.out.println("Called method7 with: " + input); } // 无参数的实例方法 public void method8() { System.out.println("Called method8"); } }
在Kotlin里想写一个myFunction,让它能动态选择调用A的某个方法,Java里直接传A::method7就行,但Kotlin里会报错?别慌,分几种情况给你解决:
情况1:让myFunction接收Kotlin函数类型参数
如果你的myFunction需要自己创建A的实例,然后调用目标方法,那要把参数类型定义为未绑定的实例方法对应的函数类型:
// 对应method7(带String参数)的函数类型是(A, String) -> Unit fun myFunction(method: (A, String) -> Unit) { val a = A() // 调用方法时传入A实例和参数 method(a, "Kotlin test") } // 调用myFunction时直接传A::method7 fun main() { myFunction(A::method7) }
如果是无参数的method8,对应的函数类型就是(A) -> Unit:
fun myFunctionNoArg(method: (A) -> Unit) { val a = A() method(a) } fun main() { myFunctionNoArg(A::method8) }
情况2:已有A的实例,传递绑定后的方法引用
如果你已经提前创建了A的实例,想把这个实例的特定方法传给myFunction,可以用绑定方法引用,写法是实例::方法名:
fun myFunctionBound(action: (String) -> Unit) { action("Bound method test") } fun main() { val a = A() // 直接传a::method7,此时不需要再传入A实例 myFunctionBound(a::method7) }
情况3:用Java函数式接口适配
如果你的代码里已经有Java定义的函数式接口(带@FunctionalInterface注解),那Kotlin可以直接兼容Java的方法引用:
先定义Java接口:
@FunctionalInterface public interface AAction { void execute(A a, String input); }
然后Kotlin的myFunction接收这个接口作为参数:
fun myFunctionWithInterface(action: AAction) { val a = A() action.execute(a, "Interface test") } fun main() { // 直接传A::method7,Kotlin会自动适配到AAction接口 myFunctionWithInterface(A::method7) }
关键注意点
- Java的静态方法引用(比如
A::staticMethod)在Kotlin里直接对应普通的函数类型,比如(ParamType) -> ReturnType,直接传递就行。 - Java的实例方法未绑定引用(
A::methodX)在Kotlin里是需要接收实例作为第一个参数的函数类型,别漏了实例参数的传递。
内容的提问来源于stack exchange,提问作者piotrek
相关产品推荐
相关产品推荐

