Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Moosphan opened this issue Jun 14, 2019 · 8 comments
Open

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

Moosphan opened this issue Jun 14, 2019 · 8 comments
Labels

Comments

@Moosphan
Copy link
Owner

No description provided.

@Vicent9920
Copy link

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 注解

@gabyallen
Copy link

gabyallen commented Jun 14, 2019

@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)

@18361237136
Copy link

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

@yangfanggang
Copy link

kotlin 我还没学怎么办

@xiaofeidev
Copy link

kotlin 我还没学怎么办

快学起来!!!

@KevinWangJc
Copy link

KevinWangJc commented Jun 24, 2020

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

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

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

@Monkey-D-Vincent
Copy link

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

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

@skymxc
Copy link

skymxc commented Jan 3, 2021

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

9 participants