我有一个函数类型作为形式参数:
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
函数?
答案 0 :(得分:2)
我把你的代码扔进了我项目中的一个模块,它构建得很好,虽然这可能是我使用多个模块的副作用因为kotlin在java项目之前总是总是编译到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编译器然后{{来解决这个问题。 1}}。
如果没有提到的解决方法,我也无法编译它。
修改:Gradle似乎无需解决方法,如演示here。
答案 1 :(得分:1)
使用以下代码
fun doSomething(method: () -> Boolean) = method()
以下java
public class Test {
public static void main(String[] args) {
System.out.println(MainKt.doSomething(() -> true));
}
}
它运作得很好。
答案 2 :(得分:0)
环境必须支持Kotlin API。
如果环境对第三方库有限制,并且不支持Kotlin API,则无法在该环境中使用Kotlin。
我回到这个问题,终于找到了问题。我工作的环境限制了第三方库,这使我无法使用Kotlin API。
由于Kotlin使用它自己的基元类型(例如Boolean
)。起初,我认为这些类型将被编译成Java原始包装器以确保完全互操作。但显然它仍然使用Kotlin API中的Boolean
。