从Java调用时,可以将`Unit`保持为Kotlin函数的返回类型吗?

时间:2017-12-19 18:52:44

标签: kotlin

我在密封的班级里面有一个kotlin功能。

fun invoke(callback: Callback): Unit

Java将方法签名视为返回void的函数。

是否可以指示Kotlin编译器将Unit作为Java的返回类型? (不是void

用例

我的用例是来自Java的jvm互操作问题,我需要实现(Result) -> Unit

// inside a java method (currently)
abstractClass.invoke(callback)
return Unit.INSTANCE

// what I'd prefer instead
return abstractClass.invoke(callback) // invoke returns Unit, but it's in Kotlin, so it maps to void in Java. So this doesn't work

3 个答案:

答案 0 :(得分:2)

对于您的边缘情况,您仍然需要处理返回void的Java方法。所以只需解决一次:

fun <T> fromConsumer(consumer: Consumer<T>): (T) -> Unit = { consumer.consume(it) }

然后直接实现/创建(Result) -> Unit并将其传递给此函数,而不是直接实现Consumer<Result>。它也可以用Java编写,只会更复杂。

答案 1 :(得分:0)

在Java中肯定可以这样做:

public kotlin.Unit test() { return null; }

但是在Kotlin你最好的选择似乎是使用函数对象:

val invoke: (Callback) -> Unit = {}

// from Java:
return abstractClass.getInvoke(callback)

答案 2 :(得分:-2)

我可能误解了你的问题。

首先,在Kotlin,

fun invoke(callback: Callback): Unit

相当于

fun invoke(callback: Callback)

在Java中,如果覆盖这样的函数,则不需要返回任何内容。

  

是否可以指示Kotlin编译器将Unit作为Java的返回类型? (不是void

不,因为Unit毫无意义。 Unit唯一有效的值是Unit本身。