Kotlin在Java项目中的高阶函数

时间:2016-01-07 20:11:16

标签: 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(() -> false);
    }
}

但我收到错误:

  

无法推断功能界面类型

当Java类在Kotlin项目中时,它可以工作,但在Java项目中则不行。在我的Java项目中使用Kotlin中的类时,我没有遇到任何其他问题,例如使用键入kotlin.Boolean的kotlin方法并使用vararg参数。

问题

如何从Java项目中正确调用doSomething函数?

3 个答案:

答案 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