【问题标题】:How Default argument and @JvmOverloads work on Kotlin?默认参数和@JvmOverloads 如何在 Kotlin 上工作?
【发布时间】:2017-09-03 13:38:25
【问题描述】:

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

【问题讨论】:

    标签: java kotlin default-arguments


    【解决方案1】:

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

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

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

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

    它会产生重载

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

    【讨论】:

      【解决方案2】:

      来自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);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-07-27
          • 2020-04-21
          • 1970-01-01
          • 2017-03-10
          • 2017-06-03
          • 1970-01-01
          相关资源
          最近更新 更多