Java项目中Kotlin的高阶函数

我有一个函数类型作为形式参数:

fun doSomething(code: () -> Boolean) = false //package function in TestKt.class 

我试着在Java中调用它,传入一个lambda:

 //Java class, in Java project class Demo { public static void main(String[] args) { TestKt.doSomething(() -> false); } } 

但是我得到的错误:

无法推断功能接口类型

它适用于Java类在Kotlin项目中,但不在Java项目中。 在我的Java项目中使用来自Kotlin的类时,我没有遇到任何其他问题,例如使用kotlin.Boolean类型的kotlin方法和使用vararg参数参数。

我如何正确调用Java项目的doSomething函数?

我把你的代码扔到我的项目中的一个模块,它的构建很好,虽然这可能是我使用多个模块的副作用,因为在java项目可以触摸它之前,kotlin 总是编译为java。

 [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] mesh-parent ....................................... SUCCESS [1.718s] [INFO] mesh-common ....................................... SUCCESS [13.141s] [INFO] mesh-controller ................................... SUCCESS [8.217s] [INFO] java-so-project ................................... SUCCESS [1.121s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 24.558s [INFO] Finished at: Thu Jan 07 20:21:30 GMT 2016 [INFO] Final Memory: 55M/341M [INFO] ------------------------------------------------------------------------ Process finished with exit code 0 

如果您正在使用maven(在单个模块中混合使用kotlin和java),则可能需要将以下内容添加到您的POM中:

 <plugin> <artifactId>kotlin-maven-plugin</artifactId> <groupId>org.jetbrains.kotlin</groupId> <version>${kotlin.version}</version> <executions> <execution> <phase>process-sources</phase> <goals> <goal>compile</goal> </goals> </execution> <execution> <phase>process-test-sources</phase> <goals> <goal>test-compile</goal> </goals> </execution> </executions> </plugin> 

我不确定这样的解决方案是否存在gradle。 如果你不使用依赖管理器,那么你应该能够通过调用kotlin编译器,然后调用javac来解决这个问题。

没有提到的解决方法,我也无法编译它。

编辑:看来Gradle不需要像这里演示的解决方法。

使用下面的代码

 fun doSomething(method: () -> Boolean) = method() 

和下面的java

 public class Test { public static void main(String[] args) { System.out.println(MainKt.doSomething(() -> true)); } } 

它工作得很好。

该环境必须支持Kotlin API。

如果环境对第三方库有限制,并且不支持Kotlin API,那么您将无法在该环境中使用Kotlin。


我回到这个问题上,终于找到了问题。 我工作的环境限制了第三方库,这阻止了我使用Kotlin API。

这是由于Kotlin使用它自己的基元类型(比如Boolean )。 起初,我认为这些类型将被编译成Java原始包装,以确保完全互操作。 但显然它仍然使用Kotlin API的Boolean