不要与默认参数争论

Kotlin词汇

短而易于使用,默认参数允许您在没有样板的情况下实现功能过载。像许多Kotlin功能一样,这感觉就像魔术。您好奇地学习它的秘密吗?请继续阅读以了解默认论点如何在引擎盖下工作。

基本用法

如果您需要超载函数,而不是多次实现相同的函数,则可以使用默认参数:

默认参数也可以应用于构造函数:

Java Interop

默认情况下,Java无法识别默认值过载:

要指示编译器生成过载方法,请使用@jvmoverloadskotlin功能上的注释:

在引擎盖下

让我们看一下Java分解代码,以了解编译器为我们生成的内容:工具 - > kotlin->显示kotlin bytecode然后按反编译按钮。

功能

我们看到编译器生成2个函数:

  • - 有1个参数:玩具当未使用默认参数时称为
  • 合成方法播放$ default- 有3个参数:玩具, 一个int目的;每当使用默认参数时,都称为称为。这目的参数始终是无效的但是INT的价值有所不同。让我们看看如何!

int参数

int参数的值播放$ default根据传递默认参数的参数的数字和索引计算。基于此参数的值,Kotlin编译器知道要调用play函数的哪些参数。

在我们的玩()示例调用,索引0的参数使用默认参数。所以,播放$ default被称为int var1 =2⁰

播放$ default((玩具)null,1,(对象)null);

播放$ default然后,实施知道的价值var0应替换为默认值。

让我们以一个更复杂的示例来查看INT参数的表现。让我们扩大我们的功能,在呼叫网站上,使用默认参数狗狗玩具

让我们看看分解代码中发生了什么:

我们看到,现在,我们的int参数为5。这是计算的方式:位置0和2处的参数使用默认参数,因此var3 =2⁰ +2²= 5。在一个钻头手术,将参数评估为这样:

  • var3&1!= 0真的所以var0 = gooddoggo
  • var3&2!= 0错误的所以var1未更换
  • var3&4!= 0真的所以var2 =吱吱作响

基于应用于var3,编译器可以计算哪些参数应替换为默认值。

对象参数

在上面的示例中,您可能已经注意到目的参数始终为null,实际上从未在播放$ default功能。此参数连接到支持覆盖函数中的默认值。

默认参数和继承

当我们想用默认参数覆盖函数时会发生什么?

让我们更改上面的示例,并:

  • 制作一个打开功能狗狗狗狗一个打开班级。
  • 创建一个新的PlayfulDoggo班级,扩展狗狗和覆盖

当我们要在PlayfulDoggo中设置默认值时。玩我们不允许我们:不允许覆盖函数为其参数指定默认值

如果我们删除覆盖我们检查了分解代码,PlayfulDoggo.play()看起来这样:

这是否意味着将来会支持带有默认参数的超级呼叫?我们只需要拭目以待。

构造函数

对于构造函数,分解的Java代码只有一个差异。让我们来看看:

构造函数还创建了合成方法,但不是目的在功能中使用,构造函数使用DefaultConstructorMarker被称为无效的

带有默认参数的辅助构造函数还将使用一个DefaultConstructorMarker,例如主要的构造函数:

结论

简单而甜美的默认参数减少了处理超载方法时需要编写的样板代码的数量,从而使我们可以为参数设置默认值。与许多Kotlin关键字一样,当可以通过窥视它为我们编写的代码来理解他们的魔法时。查看我们的其他Kotlin词汇帖子以获取更多信息。

- -

- -

有关现代工具和资源的文章,可帮助您建立人们在每个Android设备上更快,更轻松地喜欢的体验。

获取中型应用betway娱乐官网

一个说“在应用商店上下载”的按钮,如果单击,它将带您到iOS App Store
一个说“获取它,Google Play”的按钮,如果单击它,它将带您到Google Play商店
Baidu