Методы Kotlin, принимающие встроенные классы в качестве параметров - как доступ из Java?
Допустим, у меня есть:
inline class Email(value: String)
а также
fun something(email: Email)
сейчас, если я хочу позвонить something()
с Java не могу. Потому что любой метод, который принимает встроенный класс в качестве параметра, является "искаженным" (подробнее об этом здесь: https://kotlinlang.org/docs/reference/inline-classes.html) Насколько я понял, искажение переименовывает имя метода для включения "-" это недопустимый символ в Java, поэтому метод практически невидим с точки зрения Java. Это сделано преднамеренно из-за строгой безопасности типов. Но мне действительно нужно сделать метод вызываемым как из Java, так и из Kotlin. Вы знаете какой-нибудь обходной путь?
2 ответа
Согласно KEEP, который используется для обсуждения и планирования встроенных классов, в настоящее время это невозможно (запись по состоянию на 1.3.11):
Мы скомпилируем функцию
compute(UInt)
вcompile-<hash>(Int)
, где<hash>
является искажающим суффиксом для подписи. Теперь невозможно вызвать эту функцию из Java, потому что - это недопустимый символ, но с точки зрения Kotlin это обычная функция с именем compute. [Акцент мой]
Имейте в виду, что встроенные классы являются экспериментальными и могут быть изменены, поэтому, возможно, в будущем выпуске это будет возможно. Я попытался аннотировать это с @JvmName, и это также не поддерживается.
Пожалуйста, вручную отключите изменение имен Kotlin с помощью @JvmName
@JvmName("something")
fun something(email: Email)
См. документы для более подробной информации