接口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接口只有一个方法。