我在密封的班级里面有一个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
答案 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
本身。