Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
科特林';Java项目中的高阶函数_Java_Lambda_Interop_Kotlin_Higher Order Functions - Fatal编程技术网

科特林';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源代码一样)。我知道,为了便于消化,我只是这样写的。