接口bug中的Kotlin默认参数?

Bla*_*Cat 5 kotlin

kotlin文件

interface Test {

    fun test(message: String, delay: Int =100)
}

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

}
Run Code Online (Sandbox Code Playgroud)

我发现我不能@JvmOverloads在界面或类中使用.

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

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

var a=A()
a.test("1234")
Run Code Online (Sandbox Code Playgroud)

但是当我在java文件中使用它时,似乎该方法没有重载.

A a=new A();
a.test("123");//Compile error
Run Code Online (Sandbox Code Playgroud)

没有接口的以下版本可以工作

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

}
Run Code Online (Sandbox Code Playgroud)

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

 A a=new A();
 a.test("123");
Run Code Online (Sandbox Code Playgroud)

但是添加界面后如何保持相同的功能呢?

3vo*_*voC 8

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

来自Kotlin文档:

通常,如果您使用默认参数值编写Kotlin函数,它将仅在Java中显示为完整签名,并且存在所有参数.如果您希望向Java调用者公开多个重载,则可以使用@JvmOverloads批注.

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

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

为什么?因为您可以从我提到的文档中学习,@JvmOverloads指示编译器生成大量Java重载方法,从最后一个开始逐个省略每个参数. 据我所知,每个重载方法都使用一个参数调用internal方法,此附加参数具有默认值.编辑:请在此处查看@hotkey的评论

这不适用于抽象方法,因为它们没有任何主体.此外,新的Java接口将拥有更多方法,其实现必须实现所有这些方法.Kotlin界面只有一种方法.

  • 一个小的修正:*每个重载方法调用内部方法再添加一个参数* - 它不是真的,相反,对于每个函数`foo`,使用默认参数生成另一个方法`foo $ default`,它也接收一个位掩码告诉哪些参数应该用默认参数替换.使用`@ JvmOverloads`生成的所有重载也会调用此方法. (3认同)