在Kotlin中使用Java类时,有时它们使用kotlin中保留字的标识符。 java互操作文档说你可以使用反引号(`)字符,但这不适用于导入。那么如何在导入时转义保留字。
e.g。 tinkerpop库有一个名为' __'但这就是Kotlin保留的,所以如果我像下面那样导入它就会出错。
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
我可以使用这样的外卡导入它:
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*
但是因为我只使用了一个类,所以Intellij的代码格式化程序将它替换为导致错误的导入的先前版本。 (我猜这也是intellij格式化程序中的一个错误)
对于建议使用反引号的答案。它不是。即使在try.kotlinlang.org上也无法编译。 假设一个类存在定义为
package blah
class `__` {
}
答案 0 :(得分:4)
免责声明:我不是Kotlin用户。
Kotlin Grammar页面(https://kotlinlang.org/docs/reference/grammar.html#SimpleName)指出import
关键字后跟SimpleName ("." SimpleName)
,其中SimpleName
被定义为<java identifier>
或{{ 1}}
根据上述规则,每个需要转义的组件都应该用单个反引号字符包围。由于只保留姓氏,您的代码应如下所示:
"``" <java identifier> "``"
我尝试在在线Kotlin工具(http://try.kotlinlang.org/)中使用它,并且接受了语法。
我在try.kotlinlang.org中创建了一个2文件程序,我可以重现这个问题并修复它。
所以问题不仅仅是关键字和其他保留字需要用反引号进行转义(尽管在这种情况下,名称import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.`__`
(两个下划线)不是Kotlin中的关键字,但Kotlin确实如此似乎不允许保留名称甚至存在于范围内!
这是我的测试用例:
__
package blah
class `__` {
fun foo(): Int {
return 5
}
}
这给了我这个编译时错误:
import blah.__ fun test2() { val us = __() us.foo }
- 错误:(1,)姓名_,,_ ,...,在Kotlin中保留
如果我将File2.kt
更改为此,那么它可以正常工作:
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() }
- 错误:(4,13)未解决的引用:File2.kt
带有反引号和非转义双重下划线的名称的变化不会产生任何影响。
因此,似乎解决方案是在导入过程中将名称别名为别名。
答案 1 :(得分:1)
我发现一种方法是使用别名导入它,但这确实会改变代码中使用的名称。
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__ as underscore
答案 2 :(得分:0)
如文档中所述,您的导入必须如下所示:
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.`__`
然后在代码中使用下划线符号,每次都必须将其转义,因此别名是最佳解决方案:
`__`.foo()