当前位置: 首页 > 知识库问答 >
问题:

为什么我必须返回单元。在Java中实现返回单元的Kotlin函数时的实例?

温举
2023-03-14

如果我有一个Kotlin函数

fun f(cb: (Int) -> Unit)

我想从Java调用f,我必须这样做:

f(i -> {
     dosomething();
     return Unit.INSTANCE;
});

看起来很难看。为什么我不能像f(i-


共有2个答案

柳飞鸾
2023-03-14

我对Kotlin使用这种方法

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) })
}
狄冠宇
2023-03-14

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
}

当您声明时(Int)-

静态编程语言设计者决定放弃功能接口的重复,而是依赖编译器“魔法”。如果你在静态编程语言中声明一个lambda,你不必返回一个值,因为编译器会为你插入一个。

为了让您的生活更轻松,您可以编写一个helper方法来包装消费者

public class FunctionalUtils {
    public static <T> Function1<T, Unit> fromConsumer(Consumer<T> callable) {
        return t -> {
            callable.accept(t);
            return Unit.INSTANCE;
        };
    }
}

用法:

f(fromConsumer(integer -> doSomething()));

有趣的事实:静态编程语言编译器对Unit的特殊处理是您可以编写如下代码的原因:

fun foo() {
    return Unit
}

fun bar() = println("Hello World")

这两种方法在生成的字节码中都有返回类型val,但编译器足够聪明,可以弄清楚这一点,并允许您使用返回语句/表达式。

 类似资料:
  • 问题内容: 如果我有Kotlin功能 我想从Java 打电话,我必须这样做: 看起来很丑 由于Kotlin 中的Java 等同于Java ,为什么我不能这样写呢? 问题答案: Kotlin 中的Java 在大多数情况下与Java中的等效,但是仅在JVM规则允许的情况下才如此。 Kotlin中的功能类型由以下接口表示: 在声明时,从Java的角度来看,这等效于。这就是为什么您必须返回一个值。要变通解

  • 以下是presenter中调用的方法: 下面是我的测试方法: 在Super.UpdateViewModel(vm)的处理程序中,我调用“SharedPreferenceHandler.MinStance.AccessToken!!)” 在我的测试方法中有可能得到这一点吗?

  • 根据文档,newInstance()返回一个T:https://docs.oracle.com/javase/7/docs/api/java/lang/Class.html#newInstance() 所以,如果我有一个返回T的方法,为什么我必须强制转换构造函数的返回。newInstance()到T?

  • 我使用textutils.join连接一个字符串列表,但它返回null。我是在一个简单的单元测试中这样做的。 下面是有问题的代码:

  • 问题内容: 以下(逻辑上)是编译时错误: 到目前为止,一切都很好。我不明白的是,以下内容是允许的: 为什么?认识到这对于编译器应该很简单,还是我在这里错过了一些关键点? (当然,如果在三元运算符中,一个以“空分支”结尾,那么它是一个NPE,还有什么?:) 问题答案: 三元条件运算符的类型由其第二和第三操作数的类型确定。 如果是 类型是,可以同时分配和。 编译器允许您的方法返回,因为它可以自动拆箱为