Почему сгенерированный метод получения имеет знаки доллара?

Я нахожусь в процессе преобразования моей кодовой базы из Java в Kotlin, и мы конвертируем несколько классов одновременно. Сегодня во время этого процесса я заметил действительно странную проблему взаимодействия, которая, я надеюсь, поможет обойтись.

У меня был класс Java, защищенный пакетами, который я преобразовал во внутренний класс Kotlin. Вот сокращенная версия класса:

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

...

}

Я заметил, что когда я пытаюсь использовать этот класс из Java (в том же пакете), он добавляет имя сборки и знак доллара в конец моего геттера для method, Нравится:

request.getMethod$myproject_debug()

Если я сделаю поле метода общедоступным, это перестанет происходить. Я действительно надеюсь, что есть способ обойти это, так как переход на Kotlin, если это не так, будет затруднительным.

1 ответ

Такое поведение специально, как указано в официальной документации.

internal декларации становятся public на Яве. Члены internal классы проходят через искажение имен, чтобы затруднить их случайное использование из Java и разрешить перегрузку для членов с одинаковой подписью, которые не видят друг друга в соответствии с правилами Kotlin;

Вы можете сказать Jvm, какое имя метода вы хотите показать в Java, следующим образом:

internal class Request constructor(@get:JvmName("getMethod") internal val method: String)

Теперь вы сможете получить к нему доступ из Java как request.getMethod(),

Другие вопросы по тегам