简体   繁体   中英

how to use @jvmoverloads with interface in Kotlin

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM