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)
@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语言规范不允许这个功能。