首页 > 解决方案 > Groovy 无法识别 spock 中的 kotlin 构造函数

问题描述

我有用 kotlin 编写的应用程序。现在我想用 spock 和 groovy 写一些测试。我遇到的问题是,groovy 无法识别带有可选参数(?)的 kotlin 构造函数,并且发生错误:“构造函数无法应用于”

我正在使用 gradle 来构建项目。

buildscript {
    ext.kotlin_version = '1.2.50'

    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

group 'com.pl'
version '1.0-SNAPSHOT'

apply plugin: 'groovy'
apply plugin: 'kotlin'

repositories {
    mavenCentral()
}

dependencies {
    compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    testCompile(
            'org.codehaus.groovy:groovy-all:2.4.4',
            'org.spockframework:spock-core:1.1-groovy-2.4',
    )
}

compileKotlin {
    kotlinOptions.jvmTarget = "1.8"
}
compileTestKotlin {
    kotlinOptions.jvmTarget = "1.8"
}

标签: kotlingroovyspock

解决方案


默认情况下,带有可选参数的 Kotlin 构造函数作为一个构造函数生成,该构造函数采用 Java 代码中的所有参数,因此可选性仅适用于 Kotlin 代码。但是,有一个注释,@JvmOverloads您可以将其应用于构造函数和函数,以使 Kotlin 编译器发出多个 Java 签名,从而使代码在 Java 方面也是可选的。

这是 Kotlin 和 Java 的示例(我不太了解 Groovy,但我相信它会类似地工作):

class Foo @JvmOverloads constructor(
    val bar : String = "test"
)
public static void main(String args[])
{
     Foo foo = new Foo(); // bar is set to test
     System.out.println(foo.getBar()); // will print test
}

推荐阅读