WindRider
WindRider

Reputation: 12318

Kotlin methods accepting inline classes as parameters - how access from Java?

Let's say I have:

inline class Email(value: String)

and

fun something(email: Email)

now if I want to call something() from Java I can't. Because any method that is accepting an inline class as a parameter is "mangled" (more about this here: https://kotlinlang.org/docs/reference/inline-classes.html#mangling) As far as I understood mangling renames the method name to include a "-" that's an invalid character in Java, so the method is practically invisible from Java perspective. That's intentional probably because of strong type safety. But I really need to make the method callable from both Java and Kotlin. Do you know some workaround?

Upvotes: 8

Views: 670

Answers (2)

sanya5791
sanya5791

Reputation: 488

Please, manually disable Kotlin names mangling with @JvmName

@JvmName("something")    
fun something(email: Email)

See docs for more details

Upvotes: 2

Todd
Todd

Reputation: 31710

According to the KEEP that is used to discuss and plan inline classes, this is not currently possible (writing as of 1.3.11):

We'll compile function compute(UInt) to compile-<hash>(Int), where <hash> is a mangling suffix for the signature. Now it will not possible to call this function from Java because - is an illegal symbol there, but from Kotlin point of view it's a usual function with the name compute. [Emphasis mine]

Keep in mind that inline classes are experimental and subject to change, so perhaps in a future release this will be possible. I did try annotating this with @JvmName and that is also not supported.

Upvotes: 7

Related Questions