首页 文章

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

提问于
浏览
3

我在密封的课程中有一个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

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

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

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

  • -2

    在Java中肯定可以这样做:

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

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

    val invoke: (Callback) -> Unit = {}
    
    // from Java:
    return abstractClass.getInvoke(callback)
    
  • 2

    我可能误解了你的问题 .

    首先,在Kotlin,

    fun invoke(callback: Callback): Unit
    

    相当于

    fun invoke(callback: Callback)
    

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

    是否可以指示Kotlin编译器将Unit保留为Java的返回类型? (不是无效的)

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

相关问题