Kotlin不识别Java保留关键字

Kotlin不识别Java保留关键字,java,kotlin,annotation-processing,reserved-words,kapt,Java,Kotlin,Annotation Processing,Reserved Words,Kapt,我在Kotlin中使用Java的保留关键字时遇到问题。由于并非所有保留关键字都在Kotlin中可用,Kotlin编译器无法(不?)检测仅在Java中的保留关键字 例如,以default为例。它是一个Java保留关键字。这意味着你不能做以下事情 public class UserJava { public String default; } 但是,它在Kotlin中不是保留关键字,所以您可以按如下方式使用它 class UserKotlin { var default: Stri

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

例如,以
default
为例。它是一个Java保留关键字。这意味着你不能做以下事情

public class UserJava {
    public String default;
}
但是,它在Kotlin中不是保留关键字,所以您可以按如下方式使用它

class UserKotlin {
    var default: String? = null
}
对于不懂Java的人来说,很难知道它们是保留关键字。由于Kotlin编译器不会向您提供错误或任何类型的警告,说明您正在使用保留关键字,因此它可能会在以后导致一些问题,这是您无法预料的

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

现实生活中的例子是,如果您使用Room library,并且有一个如下所示的实体

@Entity
class User{
    @PrimaryKey
    var id: Int = 0
    var default: String? = null
}
房间注释处理器将生成的SQLite create查询

CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))
因此,它基本上跳过了
default
字段

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


如果我了解Java,那么我可能不愿意使用这些关键字,因为我知道这些关键字是Java中保留的。但是如果我不懂Java,也不知道问题出在哪里呢?

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


也就是说,kotlin正计划推广javascript/native,随着jvm成为其帝国的一部分,我认为他们没有任何计划添加您建议的警告。我想这些库必须适应这一点,否则会随着时间的推移而失去技巧。

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


同样的功能也可以通过另一种方式轻松实现,作为对Kotlin插件本身的检查,最好在默认情况下关闭,因为大多数人不需要它,但在某些情况下它仍然有用。我还没有发现这个问题,但我认为打开一个是合理的。

这是您正在使用的注释处理器中的错误,而不是Kotlin中的错误。对于Kotlin来说,Java或任何其他语言的保留关键字都没有特殊意义。@可能是注释处理工具错误,但不是注释处理器。这是因为
ElementFilter.fieldsIn(entity.getEnclosedElements())
只提供
id
,如果entity是
User
类的话。@yole要获得参考,请看一下这个