7

我有以下 Kotlin 枚举类:

enum class DurationModifier {
    GreaterThan {
        override val displayName = "≥"
    },
    LessThan {
        override val displayName = "≤"
    };

    abstract val displayName: String
}

它长期以来一直是我项目的一部分,并且编译得很好。这使用 IntelliJ 或 Android Studio 编译得很好,但是当我从命令行(./gradlew assembleDebug)手动运行 gradle 构建时,我得到了这个:

e: {projectDir}/build/tmp/kapt3/stubs/{package}/search/DurationModifier.java:17: error: invalid method declaration; return type required
        DurationModifier() {
        ^

我已经完全清理了我能想到的所有内容(构建目录、gradle 缓存等)。

我最近做了很多更改,但是由于 IDE 一切正常,我不知道是什么原因造成的。这里有什么问题?为什么这在 IDE 中有效,但在命令行中无效?

4

3 回答 3

6

弄清楚发生了什么。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 编译器),但显然在这种情况下并非如此。

不能真正回答为什么会发生这种情况,但它是一个解决方案。

于 2018-11-13T22:48:37.163 回答
2

我在抽象枚举函数中遇到了类似的错误。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
于 2019-03-21T18:00:26.503 回答
0

我也遇到了这个问题,刚刚下载了 Java 8 并在此处更改了项目结构(文件\项目结构)中的 Java 位置:

在此处输入图像描述

于 2020-04-09T12:24:28.307 回答