转义导入

时间:2016-03-31 03:30:09

标签: kotlin

在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 `__` {

}

使用反引号导入时会发生这种情况。 Escapingdoesnotcompile

3 个答案:

答案 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确实如此似乎不允许保留名称甚至存在于范围内!

这是我的测试用例:

File1.kt

__

File2.kt

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()

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