代码之家  ›  专栏  ›  技术社区  ›  musooff

Kotlin不标识Java保留关键字

  •  3
  • musooff  · 技术社区  · 7 年前

    在kotlin中使用java的保留关键字有问题。由于不是所有的保留关键字都在kotlin中可用,kotlin编译器不能(不是?)检测仅在Java中的保留关键字。

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

    public class UserJava {
        public String default;
    }
    

    但是,它不是kotlin中的保留关键字,因此可以如下使用

    class UserKotlin {
        var default: String? = null
    }
    

    对于不懂java的人来说,很难知道它们是保留关键字。由于Kotlin编译器不会给您一个错误,或者任何警告,您使用的是保留关键字,这可能会导致以后出现的一些问题,这是您所不期望的。

    它可能遇到的问题之一是 注释处理 你的毕业生中包括哪些图书馆 kapt 或 annotationProcessor . 例如,当您试图获取 UserKotlin 类,您将得到一个空列表,因为Java编译器不“理解”该字段 违约 忽略它(跳过它?).

    如果你用 房间 库并具有如下实体

    @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`))
    

    所以,它基本上跳过了 违约 字段。

    当我尝试使用Java保留关键字时,Kotlin有什么方式给出警告吗?或者是科特林的一个尚未修复的漏洞?或者有任何文件提到这个问题吗?。

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

    2 回复  |  直到 7 年前
        1
  •  2
  •   Pere Casafont    7 年前

    我确实怀疑这是JVM中的问题,但是是注释库。Kotlin不会暴露 default 变量;public/exposed是getter和setter。也就是说,注释库可能试图直接访问私有字段,而最终找不到它,因为它是一个保留关键字,而KOTLIN编译器可能给它一个不同的名称。图书馆不是在运行时提供任何警告吗?

    也就是说,科特林计划在JavaScript/原生上传播,而JVM正成为其帝国的一部分,我不认为他们有任何计划来添加你的建议警告。我想图书馆必须适应这一点,或者随着时间的推移而失去优势。

        2
  •  1
  •   zsmb13    7 年前

    android lint已经有了一个可选的“没有硬kotlin关键字”规则,当在java代码中使用kotlin关键字作为标识符时会发出警告,并且 interop guide 同时警告不要在Java代码中使用这些关键字。

    在KOTLIN插件本身的检查中,同样可以很容易地实现这一点,因为默认情况下大多数人都不需要它,但在某些情况下仍然有用。我还没发现这个问题 YouTrack 不过,我觉得开一个比较合理。