My codebase is mixed java and kotlin code. I'd like to use @JvmOverloads on interface method with default arguments. Like that:
@JvmOverloads
fun getClientCompanyId(clientId: Long, date: DateTime = DateTime.now()): Long
I can't do this unfortunately and I get the message that:
JvmOverloads cannot be used on interface methods
However if I use it on overridden function then I get
Platform declaration clash: The following declarations have the same JVM signature(getClientCompanyId(JLorg/joda/time/DateTime;)J):
- @JvmOverloads public open fun getClientCompanyId(clientId: Long, date: DateTime = ...): Long
- @JvmOverloads public open fun getClientCompanyId(clientId: Long, date: DateTime = ...): Long
and just for the record: when I try to put default value in overridden method I get the message that:
An overriding function is not allowed to specify default values on its parameters
Is it a possible thing to do in kotlin? Thanks for all the answers.
I believe the best you can do is to define the overloads yourself. eg:
fun getClientCompanyId(clientId: Long, date: DateTime): Long
fun getClientCompanyId(clientId: Long) = getClientCompanyId(clientId, DateTime.now())
Spoilers ahead: This answer is not satisfying.
I ran into a similar issue while converting a Java class and interface into kotlin. The only way that my legacy Java code accepts @JvmOverloads
generated code was to change my kotlin interface
into an open class
and change all fun()
into open fun()
Works but its not what we really want.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.