Is there any idea on when inline classes will be made non-experimental?
Hopefully sometime between 1.4 and 1.5, but they still have a lot of issues with them as they stand.
For example, I submitted an issue where the compiler has problems compiling a call to an inline class’s function that implements an interface’s function that uses default parameters and actually makes use of the default parameters
interface HasValue {
val value: Int
fun defaultParameter(withParameter: Int = 1) {
println("defaultParameter call with $withParameter")
}
fun noDefaultParameter(withParameter: Int) {
println("noDefaultParameter call with $withParameter")
}
}
inline class InlinedCertainValue(override val value: Int): HasValue
fun main() {
val a = InlinedCertainValue(100)
a.defaultParameter() // Comment this line out and you will not get a code generation exception
a.noDefaultParameter(25)
a.defaultParameter(66)
}
```.
Thx! Hope they will manage to fix the issues soon.
https://youtrack.jetbrains.com/issue/KT-23338
This issue still contain 84 unresolved subtasks, so I guess there is still some work to be done. Another holdup is probably the missing design for inline enums and maybe a better design for the java interop, which isn’t that great right now. Therefor I don’t think inline classes will be marked as stable before the 1.5 release. My guess is that this will be part of a mayor version so either 1.5 or 1.6.
That said unless you run into one of the obscure compiler crashes related to inline classes they work fine. I use them in my projects without any issues. And if you run into one of the codegen exceptions you can always revert the inline class to a normal class without many problems.
Just add a hashCode and equals function and everything works the same, just with boxing. Of cause this is not an option for libraries that need to keep a consistent API/ABI, but for applications using inline classes right now should be no problem.