在导入中转义保留字

在Kotlin中使用Java类时,有时会使用kotlin中保留字的标识符。 java interop文档说你可以使用反引号(`)字符,但是这在导入中不起作用。 那么如何逃避保留字的导入。

例如tinkerpop库有一个名为'__'的类,但是这是一个Kotlin保留,所以如果我像下面导入它,它会给出一个错误。

import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__ 

我可以使用这样的通配符导入它:

 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.* 

但是因为我只使用一个类,所以Intellij的代码格式化程序将其替换为导致错误的以前版本的导入。 (我猜这也是intellij格式化程序中的一个bug)

对于建议使用反向工程的答案。 它不是。 即使在try.kotlinlang.org上也不能编译。 假设一个类定义为

 package blah class `__` { } 

这是用反引号导入时发生的情况。 Escapingdoesnotcompile

免责声明:我不是Kotlin用户。

Kotlin语法页面( https://kotlinlang.org/docs/reference/grammar.html#SimpleName )指出import关键字后面跟着一个SimpleName ("." SimpleName) ,其中SimpleName被定义为<java identifier>"``" <java identifier> "``"

根据上述规则,每个需要转义的组件都应该包含单个反引号字符。 由于只有最后一个名字是保留的,你的代码应该是这样的:

 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.`__` 

我尝试使用这个在线Kotlin工具( http://try.kotlinlang.org/ ),并接受了语法。

更新

我在try.kotlinlang.org创建了一个2文件的程序,我可以重现这个问题,并修复它。

所以问题不仅仅是关键字和其他保留字需要使用反引号(尽管在这种情况下,名称__ (两个下划线)不是Kotlin中的关键字,但是Kotlin似乎不允许保留名称甚至存在范围内!

这是我的测试案例:

File1.kt

 package blah class `__` { fun foo(): Int { return 5 } } 

File2.kt

 import blah.__ fun test2() { val us = __() us.foo } 

这给了我这个编译时错误:

File2.kt – 错误:(1,)名称_ ,,_ ,…,保留在Kotlin

如果我将File2.kt更改为此,那么它工作正常:

 import blah.__ as underscore fun test2() { val us = underscore() us.foo } 

使用反引号似乎没有帮助,但它确实给了我意想不到的错误:

 import blah.`__` as `__` fun test2() { val us = `__`() <-- error is here us.foo() } 

File2.kt – 错误:( File2.kt )未解决的参考: __

带反引号和非双下划线的名称变体不起作用。

所以看来解决方法是在导入过程中将名称别名。

我发现的一种方法是使用别名来导入它,但是它确实改变了代码中使用的名称。

 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__ as underscore 

如文档中所述,您的导入必须如下所示:

 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.`__` 

然后,要在代码中使用下划线符号,您必须每次都使用下划线,所以别名是最好的解决方案:

 `__`.foo() 

Google文件: https : //kotlinlang.org/docs/reference/java-interop.html#escaping-for-java-identifiers-that-are-keywords-in-kotlin