这篇文章将为大家详细讲解有关深入浅析芬兰湾的科特林中函数的默认参数,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
在Java中,为函数的参数添加默认值是不被允许的,这是为了防止默认参数与函数重载同时使用时二义性的问题,考虑下面的例子:
空白func (p1:字符串,p2:字符串,p3:字符串=癲efault") {//做某事 } 空白func(琴弦p1, p2) {//做某事 }
假设上面的代码是可以编译通过的,那么当调用func (“p1",“p2")时,编译器会不知道到底该调用哪个方法,所以Java是不支持默认参数的,但是依然可以通过函数重载的方式实现默认参数的功能,这也是我们最普遍使用的方式:
空白func(字符串琴弦p1, p2, p3) {//做某事 } 空白func(琴弦p1, p2) { func (a, b,“default"); }
通过上述函数重载的方式,也可以实现默认参数,但是有个问题也很明显,就是如果要支持默认参数,我们需要写很多的模版代码,好像也不是那么方便,然而,芬兰湾的科特林提供了默认参数的支持,接下来看看芬兰湾的科特林中对于默认参数的支持是怎样的,又是怎么解决我们开始提到的那个二义性的问题的。
在芬兰湾的科特林中,使用默认参数也很简单,在函数定义中直接赋值即可:
上述函数定义中,c的默认值就是违约,可以这样去调用func (“p1",“p2")。同样的,针对构造函数,也可以指定默认值:
类TestDefaultParameters ( val name:字符串, val类型:字符串=癲efault" ){}那么如果想要在Java中调用芬兰湾的科特林带有默认参数的函数怎么做呢?如果在Java中直接调用func (“p1",“p2")编译器会报的错,这是需要给芬兰湾的科特林的方法加Jvm上重载的注解就可以了:
@JvmOverloads 有趣的函数(p1:字符串,p2:字符串,p3:字符串=癲efault") {//做某事 }
接下来,我们看看芬兰湾的科特林是如何实现默认参数的,首先,写一个例子如下:
乐趣主要(args: Array将上述的函数的函数定义反编译为Java实现:
@JvmOverloads 公共最后空白func (@NotNull字符串p1, @NotNull字符串p2, @NotNull字符串p3) { intrinsic。checkParameterIsNotNull (p1,“p1"); intrinsic。checkParameterIsNotNull (p2,“p2"); intrinsic。checkParameterIsNotNull (p3,“p3"); }//$ FF:合成方法 公共静态void函数默认美元(TestDefaultParameters var0,字符串var1,字符串var2,字符串var3, int var4,对象var5) { 如果(var4,4)!=0){ var3=癲efault"; } var0。func (var1 var2 var3); } @JvmOverloads 公众最终无效func (@NotNull字符串p1、p2 @NotNull字符串){ func默认美元(p1, p2,零(字符串),4(对象)零); } …//调用func函数 TestDefaultParameters。func美元违约(testDefaultParameters“position1",“position2",零(字符串),4(对象)零);中间一些代码我省略了,可以看的到,芬兰湾的科特林编译器为我们生成了三个函数的重载方法、下面我们依次来看一下分别都是什么函数:
<李>首先看到的第一个函数是带有三个参数的函数,函数内部都做了空安全的检查,这是芬兰湾的科特林的特性,由于声明函数时参数都是不为空的,所以这里需要检查参数是否为空,会抛出异常。李> <李>第二个函数我们看到名字是func美元违约,并不是函数的方法重载,而是一个新的方法,这就是默认参数实现的关键方法,这里暂且按下不表,后面详细讲解。李> <李>第三个函数依然是func方法的重载,可以看到这个方法只有两个参数,并且内部调用了第二个方法。其实这个方法是给Java调用的,由于我们将func函数声明为@JvmOverloads,所以当Java在不传递默认参数调用函数的时候,实际上调用的是这个方法。如果将@JvmOverloads去掉的话,是没有这个方法的。
深入浅析芬兰湾的科特林中函数的默认参数