我在使用Kotlin时遇到了一个问题,与Java中的保留关键字有关。由于不是所有Java中的保留关键字都可用于Kotlin,因此Kotlin编译器无法(或者说不会?)检测到仅存在于Java中的保留关键字。
例如,以default
为例。它是Java中的保留关键字。这意味着您不能按照以下方式操作。
public class UserJava {
public String default;
}
然而,在 Kotlin 中,它并不是一个保留关键字,因此您可以按照以下方式使用它。
class UserKotlin {
var default: String? = null
}
对于不懂Java的人来说,很难知道它们是保留关键字。由于Kotlin编译器不会给出错误或任何警告,告诉你正在使用保留关键字,因此可能会在以后引起一些问题,这是您没有预料到的。
可能遇到的问题之一是在注释处理期间,这是您使用
kapt
或annotationProcessor
将库包含到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并且无法弄清楚问题所在呢?
ElementFilter.fieldsIn(entity.getEnclosedElements())
仅返回id
。 - musooff