Методы 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)

См. документы для более подробной информации

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