Почему сгенерированный метод получения имеет знаки доллара?
Я нахожусь в процессе преобразования моей кодовой базы из 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()
,