默认参数和@JvmOverloads如何在Kotlin上工作?

当我们像Kotlin一样创造乐趣的时候

fun foo(bar: Int = 0, baz: Int) { /* ... */ } foo(baz = 1) // The default value bar = 0 is used 

所以在Java中,我们需要这样写它

不需要写

 void foo(int bar, int baz){ ... } void foo(int baz){ foo(0,baz); } 

假设我们有10个以上的参数。 我想知道Kotlin如何处理这个问题。 Kotlin会生成所有可能的方法吗? 或者它只是产生程序员真正使用的方法?

从文档 :

指示Kotlin编译器为该函数生成重载,以替代默认参数值。

如果一个方法有N个参数,其中M有默认值,则会产生M个过载:第一个参数取N-1个参数(除最后一个取默认值外),第二个参数取N-2个参数。上。

不会产生2 ^ N个重载。 正如文件中所说,

对于每个具有默认值的参数,这将会生成一个额外的重载,该参数将删除参数列表中的该参数及其右侧的所有参数。

对于具有默认参数的函数来说,

  fun foo(bar: Int = 1, baz: Int = 2, qux: Int = 3) { /*...*/ } 

它会产生过载

  foo() foo(bar) foo(bar, baz) foo(bar, baz, qux) 

当你有一个带缺省参数的函数时,Kotlin根据需要生成一个带有参数的综合函数,并且使用一个额外的Int作为最后的参数,并执行一些位操作

示例Kotlin函数:

 fun lotsOfParameters(a: String = "Default", b: Byte = 2, c: Char = 'p', d: Boolean = false, e: Any = true, f: Int = 2) { } 

编译的Java代码:

 public static final void lotsOfParameters(@NotNull String a, byte b, char c, boolean d, @NotNull Object e, int f) { Intrinsics.checkParameterIsNotNull(a, "a"); Intrinsics.checkParameterIsNotNull(e, "e"); } // $FF: synthetic method // $FF: bridge method public static void lotsOfParameters$default(String var0, byte var1, char var2, boolean var3, Object var4, int var5, int var6, Object var7) { if ((var6 & 1) != 0) { var0 = "Default"; } if ((var6 & 2) != 0) { var1 = 2; } if ((var6 & 4) != 0) { var2 = 'p'; } if ((var6 & 8) != 0) { var3 = false; } if ((var6 & 16) != 0) { var4 = true; } if ((var6 & 32) != 0) { var5 = 2; } lotsOfParameters(var0, var1, var2, var3, var4, var5); }