Kotlin不识别Java保留关键字

4

我在使用Kotlin时遇到了一个问题,与Java中的保留关键字有关。由于不是所有Java中的保留关键字都可用于Kotlin,因此Kotlin编译器无法(或者说不会?)检测到仅存在于Java中的保留关键字。

例如,以default为例。它是Java中的保留关键字。这意味着您不能按照以下方式操作。

public class UserJava {
    public String default;
}

然而,在 Kotlin 中,它并不是一个保留关键字,因此您可以按照以下方式使用它。
class UserKotlin {
    var default: String? = null
}

对于不懂Java的人来说,很难知道它们是保留关键字。由于Kotlin编译器不会给出错误或任何警告,告诉你正在使用保留关键字,因此可能会在以后引起一些问题,这是您没有预料到的。
可能遇到的问题之一是在注释处理期间,这是您使用kaptannotationProcessor将库包含到gradle中的库。由于Kotlin使用Java编译器,例如,当您尝试获取UserKotlin类的字段时,您将获得一个空列表,因为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
@yole 可能是注解处理工具的 bug,而不是注解处理器。这是因为如果实体是“User”类,则 ElementFilter.fieldsIn(entity.getEnclosedElements()) 仅返回 id - musooff
@yole,参考一下这个项目 - musooff
2个回答

2
我真的怀疑这不是在JVM中的问题,而是与注解库有关。Kotlin没有暴露"default"变量;公开/暴露的是getter和setter。也就是说,也许注解库正试图直接访问私有字段,并且因为它是一个保留关键字,kotlin编译器可能已经给它命名为不同的名称。那么库在运行时没有任何警告吗?
话虽如此,Kotlin计划在JavaScript/native上推广,并且随着jvm成为其帝国的一部分,我认为它们没有任何计划添加您建议的警告。我想库将不得不适应这种情况,否则随着时间的推移失去信徒。

1
Android Lint已经有一个可选的“无硬Kotlin关键字”规则,当在Java代码中使用Kotlin关键字作为标识符时会发出警告。他们的interop guide也警告不要在Java代码中使用这些关键字。
同样地,可能可以轻松地在Kotlin插件本身中实现另一种方式的检查,最好默认关闭,因为大多数人不需要它,但在某些情况下仍然很有用。我还没有在YouTrack上找到这个问题,但我认为打开一个问题是合理的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接