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

QuibblerQuibbler 2025-03-16 约 4 分钟 1360 次阅读

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

相关推荐

Parcelize:Parcelable 实现生成器
Kotlin

Parcelize:Parcelable 实现生成器

Parcelize:Parcelable 实现生成器Parcelable是安卓开发中常用的序列化方式,之前分享过一个Parcelable序列化插件,方便开发者快速生成代码,提高开发效率。1、Parcelize插件Kotlin官方也推出一个Parcelable自动生成的Gradle插件:Parcelize。1.1、引入插件在项目的build.gradle中添加:id("kotlin-parceliz

2.6k
Kotlin的继承
Kotlin

Kotlin的继承

Kotlin的继承1、超类:Any类似于Java中的Object类,Kotlin也有一个叫Any的超类,是所有类的父类,所有类都默认继承自该类。超类的定义如下,其中定义了三个函数:2、open注意上面的Any类用open修饰,表示该类可以被继承。Kotlin中的类默认都是final的,无法被继承:如果想让类可以被继承,就需要用在定义类的地方用open关键字标识该类可以被继承。3、构造器继承中涉及到

2.1k
 Kotlin基本语法
Kotlin

Kotlin基本语法

Kotlin基本语法了解Kotlin语言的基本语法。1、包kotlin文件以.kt结尾,编译文件还是如此只不过在文件名后面加上Kt后缀。这一点和Java不同,Java源文件.java,编译后为.class文件。1.1、包定义每个kotlin文件的第一行就用关键字package定义该文件所在的包。例:1.2、导包用到其它kotlin文件需要使用关键字import导入,这一点和Java一样。kotli

2.1k