我有以下Kotlin枚举类:
enum class DurationModifier {
GreaterThan {
override val displayName = "≥"
},
LessThan {
override val displayName = "≤"
};
abstract val displayName: String
}
很长一段时间以来,它一直是我项目的一部分,并且可以很好地进行编译。使用IntelliJ或Android Studio可以很好地进行编译,但是当我从命令行(./gradlew assembleDebug
)手动运行gradle build时,我得到了:
e: {projectDir}/build/tmp/kapt3/stubs/{package}/search/DurationModifier.java:17: error: invalid method declaration; return type required
DurationModifier() {
^
我已经彻底清理了所有我能想到的东西(构建目录,gradle缓存等)。
最近我做了很多更改,但是由于IDE的所有功能都可以正常工作,所以我不知道是什么原因引起的。怎么了为什么这可以在IDE中工作,但不能在命令行中工作?
答案 0 :(得分:0)
弄清楚发生了什么。 Android Studio和IntelliJ都使用捆绑的JDK(AS 3.2.1使用1.8.0_152),因此gradle在该环境中执行了kapt。但是在我的机器上,我将Java 11设置为默认Java。我使用JENV来管理多个Java版本,因此我预感将本地Java版本设置为1.8而不是11。此后工作正常。
我的理解是,Kotlin编译器应该发出Java 11编译器应该理解的Java 8字节代码(我在build.gradle中配置了Kotlin编译器这样做),但是显然在这种情况下不正确。
不是对为什么发生的答案,但这是一个解决方案。
答案 1 :(得分:0)
我在使用抽象枚举函数时遇到了类似的错误。
Gradle使用的是JDK 11。
切换到JDK 8,方法是在org.gradle.java.home
或项目指定的gradle.properties
中向HOME/.gradle/gradle.properties
添加一个gradle.properties
条目来解决此问题。
echo 'org.gradle.java.home=PATH_TO_JDK8' >> ~/.gradle/gradle.properties
答案 2 :(得分:0)