如何在Kotlin中使用带有接口的@jvmoverloads

时间:2017-01-18 14:52:14

标签: java kotlin

我的代码库是混合java和kotlin代码。我想在接口方法上使用@JvmOverloads和默认参数。像那样:

@JvmOverloads
fun getClientCompanyId(clientId: Long, date: DateTime = DateTime.now()): Long

不幸的是,我无法做到这一点,我得到的信息是:

  

JvmOverloads不能用于接口方法

但是如果我在重写函数上使用它,那么我得到

  

平台声明冲突:以下声明具有相同的JVM签名(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
  •   

并且仅用于记录:当我尝试将默认值放在重写方法中时,我收到以下消息:

  

不允许覆盖函数在其参数上指定默认值

在kotlin做一件事可能吗?谢谢你的所有答案。

2 个答案:

答案 0 :(得分:2)

我相信你能做的最好的事情就是自己定义重载。 e.g:

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

答案 1 :(得分:0)

剧透:这个答案并不令人满意。

在将Java类和接口转换为kotlin时遇到了类似的问题。我的旧版Java代码接受@JvmOverloads生成的代码的唯一方法是将我的kotlin interface更改为open class,并将所有fun()更改为open fun()

有效,但这不是我们真正想要的。