【问题标题】:Kotlin does not identify Java Reserved KeywordsKotlin 不识别 Java 保留关键字
【发布时间】:2019-01-10 09:07:25
【问题描述】:

我在 Kotlin 中使用 Java 的保留关键字时遇到问题。由于并非所有保留关键字在 Kotlin 中都可用,因此 Kotlin 编译器无法(不是吗?)检测仅在 Java 中存在的保留关键字。

default为例。它是 Java 保留关键字。这意味着您不能执行以下操作。

public class UserJava {
    public String default;
}

但是,它不是 Kotlin 中的保留关键字,因此您可以按如下方式使用它

class UserKotlin {
    var default: String? = null
}

对于不懂 Java 的人来说,很难知道它们是保留关键字。由于 Kotlin 编译器不会给您错误或任何类型的警告您正在使用保留关键字,因此它可能会在以后导致一些您不会预料到的问题。

它可能遇到的问题之一是在 AnnotationProcessing 过程中,这些库是您使用 kaptannotationProcessor 包含在 gradle 中的库。例如,当您尝试获取 UserKotlin 类的字段时,Kotlin 使用 Java 编译器,您会得到一个空列表,因为 Java 编译器不“理解”字段 default 并忽略它(跳过它?)。

现实生活中的例子是,如果您使用 Room 库并拥有如下实体

@Entity
class User{
    @PrimaryKey
    var id: Int = 0
    var default: String? = null
}

房间注释处理器将生成一个 SQLite 创建查询

CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))

所以,它基本上跳过了default 字段。

当我尝试使用 Java 保留关键字时,Kotlin 是否会发出警告?还是 Kotlin 中的一个尚未修复的错误?或者是否有任何文档提到了这个问题。

如果我了解 Java,那么我可能不愿意使用这些关键字,因为我知道这些关键字在 Java 中是保留的。但是如果我不懂 Java 并且无法弄清楚问题所在怎么办?

【问题讨论】:

  • 这是您正在使用的注释处理器中的错误,而不是 Kotlin 中的错误。对于 Kotlin,Java 或任何其他语言的保留关键字没有特殊含义。
  • @yole 它可能是注释处理工具错误,但不是注释处理器。那是因为 ElementFilter.fieldsIn(entity.getEnclosedElements()) 只给出 id 如果实体是 User 类。
  • @yole 作为参考看看这个project

标签: java kotlin annotation-processing reserved-words kapt


【解决方案1】:

老实说,我怀疑这是 JVM 中的问题,但与注释库有关。 Kotlin 没有公开 default 变量;公开/公开的是getter和setter。也就是说,也许注释库试图直接访问私有字段并最终找不到它,因为它是一个保留关键字,而 kotlin 编译器可能给它起了一个不同的名称。库在运行时根本没有给出任何警告吗?

也就是说,kotlin 正计划在 javascript/native 上传播,并且随着 jvm 成为其帝国的一部分,我认为他们没有任何计划添加您建议的警告。我想图书馆将不得不适应这一点,否则随着时间的推移会失去专家。

【讨论】:

    【解决方案2】:

    Android Lint 已经有一个可选的“无硬 Kotlin 关键字”规则,当在 Java 代码中使用 Kotlin 关键字作为标识符时会发出警告,并且它们的 interop guide 也会警告不要在 Java 代码中使用这些关键字。

    同样可以很容易地以另一种方式实现,作为 Kotlin 插件本身的检查,理想情况下默认关闭,因为大多数人不需要它,但在某些情况下它仍然有用。我还没有在YouTrack 上发现这个问题,但我认为打开一个是合理的。

    【讨论】:

      猜你喜欢
      • 2011-09-09
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2020-10-09
      相关资源
      最近更新 更多