Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中实现返回单元的Kotlin函数时,为什么必须返回Unit.INSTANCE?_Java_Kotlin_Kotlin Interop - Fatal编程技术网

在Java中实现返回单元的Kotlin函数时,为什么必须返回Unit.INSTANCE?

在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中的功

如果我有一个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) })
}