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
在界面或类中使用.
如果我添加一个@JvmOverloads
in接口,错误是@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)
但是添加界面后如何保持相同的功能呢?
这不是一个错误.@JvmOverloads
注释根本不适用于抽象方法.
来自Kotlin文档:
通常,如果您使用默认参数值编写Kotlin函数,它将仅在Java中显示为完整签名,并且存在所有参数.如果您希望向Java调用者公开多个重载,则可以使用@JvmOverloads批注.
注释也适用于构造函数,静态方法等.它不能用于抽象方法,包括接口中定义的方法.
来源:https://kotlinlang.org/docs/reference/java-to-kotlin-interop.html#overloads-generation
为什么?因为您可以从我提到的文档中学习,@JvmOverloads
指示编译器生成大量Java重载方法,从最后一个开始逐个省略每个参数.
据我所知,每个重载方法都使用一个参数调用internal方法,此附加参数具有默认值.编辑:请在此处查看@hotkey的评论
这不适用于抽象方法,因为它们没有任何主体.此外,新的Java接口将拥有更多方法,其实现必须实现所有这些方法.Kotlin界面只有一种方法.
归档时间: |
|
查看次数: |
3319 次 |
最近记录: |