为什么生成的 getter 方法中有美元符号?

use*_*853 3 kotlin kotlin-java-interop

我正在将我的代码库从 Java 转换为 Kotlin,并且我们一次转换几个类。在今天的这个过程中,我注意到一个非常奇怪的互操作问题,我希望有办法解决。

我有一个受包保护的 Java 类,我将其转换为内部 Kotlin 类。这是该课程的删节版本:

internal class Request private constructor(internal val method: String) {

...

}
Run Code Online (Sandbox Code Playgroud)

我注意到,当我尝试使用 Java 中的此类(在同一包中)时,它会将构建名称和美元符号附加到我的 getter 的末尾method。像这样:

request.getMethod$myproject_debug()

如果我将方法字段公开,这种情况就会停止发生。我真的希望有办法解决这个问题,因为如果没有办法的话,转向 Kotlin 将是一个大问题。

Chr*_*Jem 5

正如官方文档中提到的,这种行为是故意的。

internal声明变成public了Java。类的成员internal会经过名称修改,以便更难从 Java 中意外使用它们,并允许根据 Kotlin 规则重载具有相同签名但彼此看不到的成员;

您可以告诉 Jvm 您希望在 Java 中显示什么方法名称,如下所示,

internal class Request constructor(@get:JvmName("getMethod") internal val method: String)
Run Code Online (Sandbox Code Playgroud)

现在,您将能够从 java as 访问它request.getMethod()