我在kotlin中有一个函数
fun printExecutionTime(block: () -> Any) {
run {
val currentTimeMillis = System.currentTimeMillis()
block()
Logr.d("Execution time of " + block.javaClass.name + " -> " + System.currentTimeMillis().minus(currentTimeMillis))
}
}
在java代码中,我想将void引用函数作为参数传递,但不能返回bcs的返回值
PerformanceKt.printExecutionTime(this::voidFunc);
一种方法是使用界面
interface Action {
fun call()
}
是否可以在没有额外接口的情况下在kotlin中声明它,所以上面的代码可以工作?
答案 0 :(得分:5)
您是否尝试过使用Unit
?
fun f(voidFunc: () -> Unit) {
// <...>
}
upd:经过一些谷歌搜索后,我应该承认,这个解决方案不适合你。这是一个开放的issue,涵盖 Java 方法引用与 Kotlin 功能类型的使用。
但是,仍然需要在 Java 中使用解决方法(看起来很难看,是的):
public Unit voidFunc() {
// <...>
return null;
}
答案 1 :(得分:0)
您可以使用java.lang.Runnable
来避免引入其他界面,例如:
fun printExecutionTime(block: Runnable) {
run {
val currentTimeMillis = System.currentTimeMillis()
block.run()
//...
}
}
然后你可以使用java方法引用表达式如下:
PerformanceKt.printExecutionTime(this::voidFunc);
void voidFunc(){...}
答案 2 :(得分:0)
如果我也必须在Java代码中使用该功能,我将使用Runnable
或Consumer
(否则,我将使用Unit
其他答案)
fun doIt(person:Consumer<String>, action: Runnable){
person.accept("A message")
action.run();
}