科特林';Java项目中的高阶函数
我有一个函数,函数类型作为形式参数:科特林';Java项目中的高阶函数,java,lambda,interop,kotlin,higher-order-functions,Java,Lambda,Interop,Kotlin,Higher Order Functions,我有一个函数,函数类型作为形式参数: 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(() ->
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
函数?我将您的代码放入我项目中的一个模块中,它构建得很好,尽管这可能是我使用多个模块的一个副作用,因为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>
.使用以下代码
fun doSomething(method: () -> Boolean) = method()
还有下面的java
public class Test {
public static void main(String[] args) {
System.out.println(MainKt.doSomething(() -> true));
}
}
它工作得很好。您使用的kotlin版本是什么,我可以尝试扩展我的答案?:)@康纳夫妇我该怎么检查?我知道我的版本不是最新的,我在通过IDEA安装最新更新时遇到了问题,所以我想我应该让它一直运行,直到遇到问题。如果打开模块设置(在项目浏览器中右键单击项目),你应该会看到一个“库”按钮,点击该按钮,您应该会看到您正在使用的Kotlin运行时的版本。如果您没有使用Maven或类似工具,IntelliJ可能会尝试使用相同的版本进行编译。@ConnorSpencerHarries它没有指定版本()。我检查了一下,然后问:你认为这与我的另一个不依赖Kotlin库的项目有关系吗?这似乎是一个原因,但奇怪的是,使用诸如kotlin.Boolean
之类的东西在没有依赖性的情况下工作得很好。我工作的环境不支持外部依赖性。eskotlin源代码不编译为Java,它们直接编译为JVM字节码(就像Java源代码一样)。我知道,为了便于消化,我只是这样写的。