Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 482
WindRider Avatar asked Jan 17 '19 15:01

WindRider


2 Answers

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.

like image 70
Todd Avatar answered Oct 14 '22 10:10

Todd


Please, manually disable Kotlin names mangling with @JvmName

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

See docs for more details

like image 44
sanya5791 Avatar answered Oct 14 '22 09:10

sanya5791