在Java中实现返回单元的Kotlin函数时,为什么必须返回Unit.INSTANCE?
如果我有一个Kotlin函数在Java中实现返回单元的Kotlin函数时,为什么必须返回Unit.INSTANCE?,java,kotlin,kotlin-interop,Java,Kotlin,Kotlin Interop,如果我有一个Kotlin函数 fun f(cb: (Int) -> Unit) 我想从Java调用f,我必须这样做: f(i -> { dosomething(); return Unit.INSTANCE; }); 看起来很难看。为什么我不能像f(I->dosomething())那样编写它呢,因为Kotlin中的Unit相当于Java中的void。Kotlin中的Unit大部分相当于Java中的void,但是只有在JVM规则允许的情况下 Kotlin中的功
fun f(cb: (Int) -> Unit)
我想从Java调用f
,我必须这样做:
f(i -> {
dosomething();
return Unit.INSTANCE;
});
看起来很难看。为什么我不能像
f(I->dosomething())那样编写它呢
,因为Kotlin中的Unit
相当于Java中的void
。Kotlin中的Unit
大部分相当于Java中的void
,但是只有在JVM规则允许的情况下
Kotlin中的功能类型由以下接口表示:
public interface Function1<in P1, out R> : Function<R> {
/** Invokes the function with the specified argument. */
public operator fun invoke(p1: P1): R
}
用法:
f(fromConsumer(integer -> doSomething()));
有趣的事实:Kotlin编译器对
单元
的特殊处理是您可以编写如下代码的原因:
fun foo() {
return Unit
}
或
这两种方法在生成的字节码中都有返回类型
void
,但编译器足够聪明,可以解决这个问题,并允许您使用返回语句/表达式。我对Kotlin&Java使用这种方法。您将在Java中看到MyKotlinClass的方法,在Kotlin中您将看到这两种方法(类方法+扩展函数)。
MyKotlinClass{
//方法在Java中使用,但不限于在Kotlin中使用。
funf(cb:Consumer){//Java8 Consumer,或具有相同接口的任何自定义
int i=getYourInt()
cb.接受(一)
}
}
//科特林分机。它将用于科特林。
fun MyKotlinClass.f(cb:(内部)->单位){
f(消费者{cb(it)})
}
很难相信,如果没有真实的单元实例,编译器无法找出最后一个示例。不幸的是java.util.function.*
仅在23以上可用。参考这个答案,并用它来支持下面的API这是丑陋的,让我甚至不想使用Kotlin。随着我越来越多地使用这种语言,我一次又一次地看到这些奇怪的事情。这是因为Java互操作。Kotlin本身很好,也很优雅。@It'sYourAppLLC只有在Java代码中使用Kotlin代码时才能看到这一点。简单的解决方法是消除Java代码的使用,并用Kotlin编写所有代码。有了Kotlin,就没有理由再使用Java了。虽然看起来很优雅,但在运行时创建两个不同的匿名对象并不好。
fun foo() {
return Unit
}
fun bar() = println("Hello World")
MyKotlinClass {
//Method to use in Java, but not restricted to use in Kotlin.
fun f(cb: Consumer<Int>) { //Java8 Consumer, or any custom with the same interface
int i = getYourInt()
cb.accept(i)
}
}
//Extension for Kotlin. It will be used in Kotlin.
fun MyKotlinClass.f(cb: (Int) -> Unit) {
f(Consumer { cb(it) })
}