接口bug中的Kotlin默认参数?

kotlin文件

interface Test { fun test(message: String, delay: Int =100) } class A: Test { override fun test(message: String, delay: Int) { } } 

我发现我不能在接口或类中使用@JvmOverloads

如果我在接口中添加@JvmOverloads ,错误是@JvmOverloads annotation cannot be used on interface method ,如果我在类中添加@JvmOverloads ,错误是platform declaration clash....

但是,我似乎能够使用kotlin文件中的默认参数,就像这样。

 var a=A() a.test("1234") 

但是,当我在一个Java文件中使用它,似乎该方法没有超载。

 A a=new A(); a.test("123");//Compile error 

以下版本无界面可以工作

 class A { @JvmOverloads fun test(message: String, delay: Int=100) { } } 

然后我可以在java文件中正常使用它

  A a=new A(); a.test("123"); 

但是如何在添加接口后保持相同的function呢?

这不是一个错误。 @JvmOverloads注释根本不适用于抽象方法。

从Kotlin文档:

通常情况下,如果您使用默认参数值编写Kotlin函数,则只能在Java中将其显示为完整签名,并且所有参数均存在。 如果您希望向Java调用者公开多个重载,则可以使用@JvmOverloads注释。

注解也适用于构造函数,静态方法等。 它不能用于抽象方法,包括在接口中定义的方法

来源: https : //kotlinlang.org/docs/reference/java-to-kotlin-interop.html#overloads-generation

为什么? 因为你可以从我刚才提到的文档中学习, @JvmOverloads指示编译器生成一堆Java重载方法,从最后一个开始逐个省略每个参数。 据我所知,每个重载的方法调用一个多个参数的内部方法,这个额外的参数有默认值。 编辑: 在这里看@hotkey的评论

这不适用于抽象方法,因为它们没有任何内容。 新的Java接口也有更多的方法,它的实现将不得不实现所有的方法。 Kotlin接口只有一个方法。