首页 文章

默认参数和@JvmOverloads如何在Kotlin上运行?

提问于
浏览
2

当我们像这样用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会生成所有可能的方法吗?或者它只是生成程序员真正使用的方法?

3 回答

  • 3

    不会产生2 ^ N次重载 . 如docs所述,

    对于具有默认值的每个参数,这将生成一个额外的重载,该参数具有此参数,并且参数列表中右侧的所有参数都已删除 .

    对于具有默认参数的函数,例如,

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

    它会产生过载

    foo()
     foo(bar)
     foo(bar, baz)
     foo(bar, baz, qux)
    
  • 1

    来自documentation

    指示Kotlin编译器为此函数生成替换默认参数值的重载 . 如果一个方法有N个参数且其中M个有默认值,则会产生M个重载:第一个采用N-1个参数(除了最后一个采用默认值),第二个采用N-2个参数,所以上 .

  • 3

    当你有一个带有默认参数的函数时,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);
    }
    

相关问题