是否可以在不同的源集中使用Kotlin软件包功能和软件包属性?当我尝试这样做时,我抛出了NoSuchMethodError
。
示例
我有带有Kotlin代码的Gradle项目以及其中的两个资源集main
和test
。
在main
中,文件之一中包含以下代码:
package ru.ifmo.ctddev.igushkin.dkvs
...
public val payloadSplitter: String = " ### "
在
test
中,我尝试使用以下代码访问payloadSplitter
:package ru.ifmo.ctddev.igushkin.dkvs
...
public class MessageTests {
...
test fun testParsing() {
...
checkParseAndToString("p1b 345 ${payloadSplitter} set a b c")
}
...
}
正是在访问
payloadSplitter
的第一行中,在运行时我得到了java.lang.NoSuchMethodError: ru.ifmo.ctddev.igushkin.dkvs.DkvsPackage.getPayloadSplitter()Ljava/lang/String;
其他全局变量和函数在
test
中也无法访问,并且具有相同的错误。UPD Kotlin团队解释了此问题,并宣布了修复here。
最佳答案
对于类之外的属性和方法,Kotlin创建一个名为$ {packagename} Package的Java类,其属性和方法实现为静态方法和变量。对于多个源集,java类将创建两次,每个源集一次。您的问题是测试源集“包类”隐藏了在主源集中编译的类。
如以上注释中所述,请避免在测试源集中包含任何顶级属性或方法,以防止Kotlin编译器在测试输出目录中创建此包类。