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