【发布时间】: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 过程中,这些库是您使用 kapt 或 annotationProcessor 包含在 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