当从Java调用Kotlin函数的时候可能把`Unit`作为返回types吗?

我在密封的类中有一个kotlin函数。

fun invoke(callback: Callback): Unit 

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

是否可以指示Kotlin编译器将Unit保留为Java的返回types? (不是void

用例

我的用例是Java中的jvm interop问题,我需要实现(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 Solutions collect form web for “当从Java调用Kotlin函数的时候可能把`Unit`作为返回types吗?”

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

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

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

在Java中这样做肯定是可能的:

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

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

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

我可能误解了你的问题。

首先,在Kotlin,

 fun invoke(callback: Callback): Unit 

相当于

 fun invoke(callback: Callback) 

在Java中,如果你重写这样的函数,你不需要返回任何东西。

是否可以指示Kotlin编译器将Unit保留为Java的返回types? (不是void

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

  • 是否可以为参数函数定义一个默认值?
  • 被其他同伴对象引用的密封类对象神秘地变为空
  • 如何在现有的Android应用程序中使用Kotlin?
  • 从Java加载Kotlin在运行时生成的类
  • 如何在Android Studio 3.1 Canary 3中添加Gradle的Kotlin插件
  • @Rule>在Kotlin Junit测试中必须是公共的ValidationError
  • UNRESOLVED_REFERENCE未解决的参考:isInitialized
  • 是否可以在Kotlin的列表中传播一个列表?
  • 如何在Kotlin中运行编译后的类文件?
  • 使用一个对象来实现一个空List的错误
  • 我可以使用lambda的名称作为“括号外”传递的参数吗?
  • Kotlin language will be the best programming language for Android.