25
votes

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.

2
I encountered the same problem, have you ever found a better solution? - BlackCat
as far as I know, there isn't one - xklakoux

2 Answers

8
votes

I believe the best you can do is to define the overloads yourself. e.g.:

fun getClientCompanyId(clientId: Long, date: DateTime): Long
fun getClientCompanyId(clientId: Long) = getClientCompanyId(clientId, DateTime.now())
2
votes

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.