【发布时间】:2021-07-18 17:28:53
【问题描述】:
有一个Java接口
interface MyContract {
<M> void execute(Class<M> argClass, Consumer<M> action);
<M, R> R execute(Class<M> argClass, Function<M, R> action);
}
默认情况下,从 Kotlin 代码中调用 execute 方法时,编译器总是使用第一个重载方法,即使显式设置了预期类型,也会出现编译错误:
MyContract myContract = createSomehow();
val x: Int = myContract.execute(SomeClass::class.java, { it -> 1})
Compilation error:
Type mismatch: inferred type is Unit but Int was expected
为了强制编译器使用第二个重载方法,我添加了这个样板:
val fn: (SomeClass) -> Int = { it -> 1 }
val x: Int = myContract.execute(SomeClass::class.java, fn)
在这种情况下,表达意图调用特定重载方法的正常语法方式是什么?
【问题讨论】:
-
你可以强制你的第二个参数显式地成为一个函数:
val x = myContract.execute(SomeClass::class.java, Function{ it -> 1 }). -
你还需要
import java.util.function.Function,因为kotlin.Function是默认导入的。
标签: kotlin methods overloading