Kotlin拥有丰富的语法糖。在本文中将详细介绍函数中的默认参数和与Java的互操作。
假如有个函数传入两个整型,返回其相加的值。第二个数在没有传入值时为0:
fun add(i:Int,default:Int = 0) = i+default
fun main(args: Array<String>) {
add(9)
}
有了默认参数就可以轻松的实现函数重载。但如果在Java中调用该方法时,你就会发现其只有一个函数,并不能实现重载:
private void test(){
MainKt.add(1,2);
}
因为Java在默认情况下识别默认参数,如果你想让编译器给你生成对应的方法来实现重载,只需要给该函数添加注解:@JvmOverloads 。
@JvmOverloads
fun add(i:Int,default:Int = 0) = i+default
通过将其反编译后可以看到:编译器会生成三个函数:两个重载方法和一个add$default方法:
public final class MainKt {
@JvmOverloads
public static final int add(int i, int var1) {
return i + var1;
}
// $FF: synthetic method
@JvmOverloads
public static int add$default(int var0, int var1, int var2, Object var3) {
if ((var2 & 2) != 0) {
var1 = 0;
}
return add(var0, var1);
}
@JvmOverloads
public static final int add(int i) {
return add$default(i, 0, 2, (Object)null);
}
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
add$default(9, 0, 2, (Object)null);
}
}
在传入默认参数时,传入的Object始终为null,第三个参数是该位置的索引值。当索引值&位置不为0时则将第二个参数设置为默认值。