Kotlin 在导入中转义保留字

Kotlin 在导入中转义保留字,kotlin,Kotlin,在Kotlin中使用Java类时,有时它们使用Kotlin中保留字的标识符。java互操作文档说可以使用backtick(`)字符,但这在导入中不起作用。那么如何在导入时转义保留字呢 e、 tinkerpop库有一个名为“_u”的类,但这是一个保留的Kotlin,所以如果我像下面这样导入它,它会给出一个错误 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__ 我可以使用通配符导入它,如下所示: import or

在Kotlin中使用Java类时,有时它们使用Kotlin中保留字的标识符。java互操作文档说可以使用backtick(`)字符,但这在导入中不起作用。那么如何在导入时转义保留字呢

e、 tinkerpop库有一个名为“_u”的类,但这是一个保留的Kotlin,所以如果我像下面这样导入它,它会给出一个错误

import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
我可以使用通配符导入它,如下所示:

import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.`__`
但因为我只使用了一个类,所以Intellij的代码格式化程序将其替换为给出错误的导入的早期版本。(我猜这也是intellij格式化程序中的一个bug)

对于建议使用backtick“works”的答案。事实并非如此。即使在try.kotlinlang.org上也无法编译。 假设存在一个定义为

package blah

class `__` {

}
这是使用反勾号导入时发生的情况。

我发现一种有效的方法是使用别名导入它,虽然可以,但它确实会更改代码中使用的名称

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

免责声明:我不是Kotlin用户

Kotlin语法页()指出,
import
关键字后面跟着一个
SimpleName(“.SimpleName”)
,其中
SimpleName
被定义为
“`````

根据上述规则,需要转义的每个组件都应该用单个反勾字符包围。由于只保留姓氏,您的代码应如下所示:

import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.`__`
我尝试在一个在线Kotlin工具()中使用它,语法被接受

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

因此,问题不仅在于关键字和其他保留字需要用反勾号转义(尽管在本例中,名称
\uuuu
(两个下划线)在Kotlin中不是关键字,而且Kotlin似乎甚至不允许保留名称存在于范围中

下面是我的测试用例:

文件1.kt 文件2.kt 这给了我这个编译时错误:

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()
}
导入废话`__`
趣味测试2(){

val us=`u`()如文档中所指定,您的导入必须如下所示:

import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.`__`
然后,要在代码中使用下划线符号,每次都必须对其进行转义,因此别名是最佳解决方案:

`__`.foo()

文档:

这无法编译。请参见更新答案的屏幕截图。@LionelPort我在try.kotlinlang.org中输入了完全相同的代码,并且成功了-您是否键入了不同的反勾号字符?您使用的是什么键盘布局?您的计算机是否设置为不同的区域设置或编码?是反勾号字符(美国intl键盘布局上1的左边)。它在代码块中工作良好,只是在导入中没有。我已经定义了“\在blah包中单独初始化,因此可能这就是为什么您没有看到错误。我已更新了答案以显示类的定义。@LionelPort我现在可以重现问题并找到解决方案。我已更新了答案。是的,这是我昨天得出的结论(请参见下面的答案)。您可以通配符(*)导入或别名。在我看来,这似乎是一个错误,因为它没有得到一致的应用。这不会编译。请参阅更新答案中的屏幕截图。这可能是解析器中的错误