首页 > 其他分享 >Kotlin扩展函数原理解析

Kotlin扩展函数原理解析

时间:2024-01-29 15:59:17浏览次数:22  
标签:函数 访问 Kotlin 扩展 String 解析 lastChar addTo

一、扩展函数

扩展函数可以方便地给现有类增加属性和方法而不改动类地代码。

二、原理

fun String.addTo(s: String): String{
    return this + s
}

反编译:


@Metadata(
   mv = {1, 6, 0},
   k = 2,
   d1 = {"\u0000\n\n\u0000\n\u0002\u0010\u000e\n\u0002\b\u0002\u001a\u0012\u0010\u0000\u001a\u00020\u0001*\u00020\u00012\u0006\u0010\u0002\u001a\u00020\u0001¨\u0006\u0003"},
   d2 = {"addTo", "", "s", "app_releaseFlavorDebug"}
)
public final class TestKt {
   @NotNull
   public static final String addTo(@NotNull String $this$addTo, @NotNull String s) {
      Intrinsics.checkNotNullParameter($this$addTo, "$this$addTo");
      Intrinsics.checkNotNullParameter(s, "s");
      return $this$addTo + s;
   }
}

可以看出扩展函数实际上是生成了一个静态方法,并且将被扩展的类的对象传进了函数中。

由此我们可以知道:
我们在扩展函数中可以访问被扩展的类的函数与属性,但是不能访问私有的函数与属性,其访问权限与对象访问权限一致。

三、扩展属性

扩展属性提供了一种方法能通过属性语法进行访问的API来扩展。尽管它们被叫做属性,但是它们不能拥有任何状态,它不能添加额外的字段到现有的Java对象实例。

val String.lastChar: Char get() = this[length -1]

原理与扩展函数类似。

public static final char getLastChar(@NotNull String $this$lastChar) {
      Intrinsics.checkNotNullParameter($this$lastChar, "$this$lastChar");
      return $this$lastChar.charAt($this$lastChar.length() - 1);
   }

四、伴生对象的扩展函数

class Test{
    companion object{

    }
}

fun Test.Companion.get() {

}

五、总结

1、我们在扩展函数中可以访问被扩展的类的函数与属性,但是不能访问私有的函数与属性,其访问权限与对象访问权限一致。
2、扩展函数不能被子类重写。
3、扩展函数实际是一个静态函数处于类的外部,而成员函数是类的内部函数。

标签:函数,访问,Kotlin,扩展,String,解析,lastChar,addTo
From: https://www.cnblogs.com/tangZH/p/17994684

相关文章

  • Qt QtConcurrent::run()函数的两种写法
    第一种,使用lambda表达式1QFuture<void>future=QtConcurrent::run([=](){2//Codeinthisblockwillruninanotherthread3});4...第二种,使用成员函数调用QByteArray的成员函数split()1//call'QList<QByteArray>QByteArray::split(charsep)c......
  • 为什么button command 不需要lambda函数添加参数 但是 bind 需要
    combo=tk.ttk.Combobox(frame_combo,values=self.lis,width=25,font=("MicrosoftYaHei",20))combo.pack(side='top',anchor="nw")combo.set("请选择功能")combo.option_add("*TCombobox*......
  • 如何使用云函数
    1.新建云函数 2.取好云函数的名字【video】后,即在目录下创建如下图文件 3.在index.js中编写云函数内容 4.写好云函数之后,上传并部署 5.在小程序中调用 完成......
  • 名企测试管理大咖解析沟通管理,多维度经验分享
    沟通管理在测试开发中扮演着至关重要的角色,它不仅是团队协作的基石,也是项目成功的关键因素之一。有效的沟通管理能够促进信息传递、问题解决以及团队协同工作,为测试开发的顺利进行提供坚实支持。但在实际工作中却有很多的问题,你是否在工作中遇到过以下问题呢?在团队会议上,需要分享自......
  • [转]TypeScript类型编程中的extends和infer示例解析
    转自;https://www.jb51.net/javascript/294261vgi.htm TypeScript类型编程中的extends和infer示例解析 −目录引文extends条件判断约束参数类型约束infer推导的局部变量类型类型转换infer组合使用ReturnTypeParameters引文在刚接触TypeScript的时候,......
  • java读取并解析XML文件的方法有哪些?
    XMLStreamReader:1. DOM(DocumentObjectModel)方式:DOM将整个XML文档加载到内存中,形成一颗树状结构,然后通过操作这个树状结构来获取所需要的数据。示例代码如下:importjavax.xml.parsers.*;importorg.w3c.dom.*;publicclassXMLParser{publicstaticvoidmain(Stri......
  • 详解Smooth_L1_Loss函数的计算方式
    详解SmoothL1Loss函数的计算方式在深度学习中,SmoothL1Loss函数是一种用于回归任务的损失函数。它在一定程度上克服了均方误差(MSE)损失函数的局限性,特别适用于处理离群值。简介SmoothL1Loss函数是HuberLoss的一种近似形式。它通过引入平滑因子,使损失函数在离群值附近呈现鲁棒......
  • 【快速阅读四】基于边缘信息的模版匹配中贪婪度参数的简单解析。
    基于边缘的匹配有个贪婪度的参数,其对提高查找目标的速度有着比较关键的作用,本问简单的记录了下对这个参数的一些认识和推导。对这个课题稍作研究,以便记录。在基于边缘的模版匹配中,我们知道可以有个贪婪度参数可以设置。在Halcon的帮助文档中,也有对......
  • super().__init__()函数
    原文链接:https://blog.csdn.net/thy0000/article/details/133557862super().__init__()是用于在Python中调用父类(也称为超类或基类)的构造方法(__init__方法)的一种方式。这通常在子类的构造方法中使用,以便在添加子类特有的功能之前,初始化父类中定义的属性和执行其他必要的设置......
  • SQLServer和Oracle常用函数对比
      1.绝对值 S:select abs(-1) value O:select abs(-1) value from dual 2.取整(大) S:select ceiling(-1.001) value O:select ceil(-1.001) value from dual 3.取整(小) S:select floor(-1.001) value O:select flo......