android - 使用 gradle 包装器构建 Kotlin 枚举类中的无效方法声明
问题描述
我有以下 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 中有效,但在命令行中无效?
解决方案
弄清楚发生了什么。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 编译器),但显然在这种情况下并非如此。
不能真正回答为什么会发生这种情况,但它是一个解决方案。
推荐阅读
- swift - 仅检测到一次碰撞
- javascript - socket.io - 客户端通过同一服务器连接到两个套接字
- python - Python模糊匹配程序运行很慢
- python - selenium python从javascript窗口对象返回数据
- rest - RESTful API 范式中描述资源统计的正确方法是什么?
- html - 在 Gmail 电子邮件中使用 Flex
- php - preg_match:修复了在评论框中阻止 https:// URL 链接的问题
- d3.js - d3.enter() 不是函数
- python - TypeError: unhashable type: 'list' while loading pre-trained ResNet in Tensorflow?
- python - 无法从应用程序访问站点包中的 python 安装包