Kotlin重载函数和默认参数冲突,会调用谁?

Quibbler 1月前 110

Kotlin重载函数和默认参数冲突,会调用谁?


        有一个简单的关于函数重载和默认参数结合的问题,最近问了很多开发都不知道,说明平时没有关注或者很少发散思考。


        首先,定义重载函数。这个大家都不陌生,Koltin当然也可以,定义两个printMessage同名方法:一个有参数,一个无参数。

    fun printMessage(message: Double) {
        println("Double: $message")
    }
    
    fun printMessage() {
        println("Double")
    }


        同时Koltin也支持默认参数:这里给fun printMessage(message: Double = 1)方法的参数添加一个默认值。

    fun printMessage(message: Double = 1.0) {
        println("Double: $message")
    }
    
    fun printMessage() {
        println("Double")
    }

         那么问题来了,如果调用printMessage()方法,是调用无参的fun printMessage()重载,还是调用有默认参数的重载fun printMessage(message: Double = 1.0)


        先说标准答案:在 Kotlin 中,当存在多个重载函数时,编译器会根据调用时提供的参数数量和类型来选择最匹配的函数。如果调用时没有提供任何参数,编译器会选择参数数量最少的重载函数。所以调用

    printMessage()

        实际上调用的是参数最少(这里是无参)的fun printMessage()方法

    fun printMessage() {
        println("Double")
    }


        上面的代码示例放到编译器里看对应的Java代码,其实是有三个方法,使用默认参数特性的时候会多生成一个合成方法(synthetic method):

   public final void printMessage(double message) {
      String var3 = "Double: " + message;
      System.out.println(var3);
   }
   
   // $FF: synthetic method
   public static void printMessage$default(Test var0, double var1, int var3, Object var4) {
      if ((var3 & 1) != 0) {
         var1 = (double)1.0F;
      }
      var0.printMessage(var1);
   }
   
   public final void printMessage() {
      String var1 = "Double";
      System.out.println(var1);
   }


         在 Kotlin 中,函数重载和默认参数是两个非常强大的特性,可以编写更加灵活和简洁的代码。当同时使用这两个特性时,需要注意参数的数量和类型,以及默认参数的解析规则。通过合理设计函数签名,避免歧义调用,确保代码的可读性和可维护性。


不忘初心的阿甘
最新回复 (0)
    • 安卓笔记本
      2
        登录 注册 QQ
返回
仅供学习交流,切勿用于商业用途。如有错误欢迎指出:fluent0418@gmail.com