Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-06-14:Kotlin 中注解 @JvmOverloads 的作用?

Moosphan opened this issue · comments

2019-06-14:Kotlin 中注解 @JvmOverloads 的作用?

Kotlin@JvmOverloads注解的作用就是:在有默认参数值的方法中使用@JvmOverloads注解,则Kotlin就会暴露多个重载方法。

@JvmOverloads fun f(a: String, b: Int=0, c:String="abc"){
}
// 相当于Java三个方法 不加这个注解就只能当作第三个方法这唯一一种方法
void f(String a)
void f(String a, int b)
// 加不加注解,都会生成这个方法
void f(String a, int b, String c)

参考:Kotlin中@JvmOverloads 注解

@jvmoverloads注解的作用就是:在有默认参数值的方法加上@jvmoverloads注解,则Kotlin就会暴露多个重载方法。可以减少写构造方法。
例如:没有加注解,默认参数没有起到任何作用。


fun f(a: String, b: Int = 0, c: String="abc"){
    ...
}
那相当于在java中:void f(String a, int b, String c){
}
如果加上注解@JvmOverloads ,默认参数起到作用
@JvmOverloads 
fun f(a: String, b: Int = 0, c: String="abc"){
    ...
}
相当于Java中:
三个构造方法,
void f(String a)
void f(String a, int b)
void f(String a, int b, String c)

@jvmoverloads注解了有参方法,该方法就会有很多重载方法。如
@jvmoverloads
fun method (a:Int,b:String,c:Boolean)
现在method可以有三个注解方法

kotlin 我还没学怎么办

kotlin 我还没学怎么办

快学起来!!!

讲真,看到上面的回答都有问题,忍不住回答一下。

Kotlin 中类似 @JvmXxx 这样的注解都是专门为了兼容 Java 而存在的。纯 Kotlin 开发的话,完全可以不使用 @jvmoverloads,也能有多种重载构造方法的效果,默认参数也会生效。

加上 @jvmoverloads,只是为了在 Java 中使用这个 Kotlin 类时,能访问到多个重载方法。

讲真,看到上面的回答都有问题,忍不住回答一下。

Kotlin 中类似 @JvmXxx 这样的注解都是专门为了兼容 Java 而存在的。纯 Kotlin 开发的话,完全可以不使用 @jvmoverloads,也能有多种重载构造方法的效果,默认参数也会生效。

加上 @jvmoverloads,只是为了在 Java 中使用这个 Kotlin 类时,能访问到多个重载方法。

根据你的回答 我在说下上边的问题把,在 kotlin 中,你给参数赋值之后,可以不用传对应的参数,因为赋值的数据相当于默认值,除此楼外的回答都是不完全正确的。
fun getPersonal() {
setPersonal()
setPersonal("WhenSun1")
setPersonal ("WhenSun2", 11)
}

fun setPersonal (name: String = "WhenSun", age: Int = 10){
println("$name $age")
}

输出结果:
WhenSun 10
WhenSun1 10
WhenSun2 11

在kotlin 中函数的参数是可以有默认值的,在使用时也可以使用参数名称传入具体的函数而不用根据顺序传入,这样就规避掉了函数的重载,不用写多个函数签名了,但是在 Java 中是不行的,加上这个注解之后,会根据参数的默认值情况生成对应的重载函数。