Методы Kotlin, принимающие встроенные классы в качестве параметров - как доступ из Java? - PullRequest
0 голосов
/ 17 января 2019

Допустим, у меня есть:

inline class Email(value: String)

и

fun something(email: Email)

Теперь, если я хочу позвонить something() с Java, я не могу. Потому что любой метод, который принимает встроенный класс в качестве параметра, является "искаженным" (подробнее об этом здесь: https://kotlinlang.org/docs/reference/inline-classes.html#mangling) Насколько я понял, искажение переименовывает имя метода, чтобы включить "-", это недопустимый символ в Java Таким образом, метод практически невидим с точки зрения Java. Это сделано преднамеренно из-за строгой безопасности типов. Но мне действительно нужно сделать метод вызываемым как из Java, так и из Kotlin. Знаете ли вы какой-нибудь обходной путь?

1 Ответ

0 голосов
/ 17 января 2019

Согласно KEEP , который используется для обсуждения и планирования встроенных классов, в настоящее время это невозможно (запись по состоянию на 1.3.11):

Мы скомпилируем функцию от compute(UInt) до compile-<hash>(Int), где <hash> - суффикс искажения для подписи. Теперь невозможно вызвать эту функцию из Java, потому что - там это недопустимый символ , но с точки зрения Kotlin это обычная функция с именем compute. [Акцент мой]

Имейте в виду, что встроенные классы являются экспериментальными и могут быть изменены, поэтому, возможно, в будущем выпуске это будет возможно. Я попытался аннотировать это с @JvmName, и это также не поддерживается.

...