4

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

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

public class UserJava {
    public String default;
}

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

class UserKotlin {
    var default: String? = null
}

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

它可能遇到的问题之一是在AnnotationProcessingkapt期间,这是您使用或包含在 gradle 中的库annotationProcessor。例如,当您尝试获取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 并且无法弄清楚问题所在怎么办?

4

2 回答 2

2

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

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

于 2019-01-10T09:17:50.987 回答
1

Android Lint 已经有一个可选的“No Hard Kotlin Keywords”规则,当在 Java 代码中使用 Kotlin 关键字作为标识符时会发出警告,并且他们的互操作指南也警告不要在 Java 代码中使用这些关键字。

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

于 2019-01-10T09:26:29.540 回答