如何从 Java 访问 Kotlin 的“backtickedFunctions”?

Ar3*_*r3s 3 java syntax idioms language-interoperability kotlin

长话短说:

java中是否有一个简单的语法来访问kotlins反引号函数,例如fun `if`(){...}

长版:

在 Kotlin 中,人们可以编写以下类。

class ShapeShifter {
    fun speak() { println("Hello fellow hooman") }
    fun `speakLikeA`() { println("Meow") }
    fun `speakLikeA`() { println("Bwoof !") }
    fun `speakLikeA`() { println("NOOT NOOT ! (you would'nt have so much problems with linux ...)") }
}
Run Code Online (Sandbox Code Playgroud)

这会工作得很好......你所有的 kotlin-ers 同事都可以以你所有的形式与你交谈,如下所示:

ShapeShifter().`speakLikeA`() // would work like a charm
Run Code Online (Sandbox Code Playgroud)

但是当与 java-ist 麻瓜互动时,你的秘密身份将是安全的,因为我很确定 java-ist 只能像这样与你互动:

new ShapeShifter().speak()
Run Code Online (Sandbox Code Playgroud)

我的问题是:有没有一种方法可以让 java 普通人访问反引号的 kotlin 函数,而无需诉诸使用黑魔法,例如内省/反射,如下所示:

var tomJedusor = new ShapeShifter();
ShapeShifter.class.getDeclaredMethod("speakLikeA").invoke(tomJedusor); //the forbidden arcane spell banned from Konoha ...
Run Code Online (Sandbox Code Playgroud)

oco*_*cos 5

@JvmName注释允许您定义该方法的 jvm 名称。

@JvmName("speakLikeACat")
fun `speakLikeA`() { println("Meow") }

@JvmName("speakLikeADog")
fun `speak like a `() { println("Bwoof") }
Run Code Online (Sandbox Code Playgroud)

现在,您可以从 java 代码访问该方法。

// .java 
shapeShifter.speakLikeACat();
shapeShifter.speakLikeADog();
Run Code Online (Sandbox Code Playgroud)

访问反引号的kotlin 方法,来自 java 的字段只能通过某些jvm annotations. Kotlin 编译器必须遵循java语言规范来生成字节码。实际上java语言规范不允许这个功能。

  • Unicode 字符在 java 中是合法的,只要它们是 UTF-16 的,因此 `double π = Math.PI;` 是有效的。但它在 Unicode 基础平面之外,所以这就是为什么它是非法的。 (3认同)
  • 正如吉兹所解释的,这是不可能的。如果“纯 kotlin 库”也打算由 java 项目使用,则库设计必须与“java”兼容。 (2认同)