【解密 Kotlin 扩展函数】扩展函数的底层原理(十八)

导读大纲

      • 1.1.1 从 Java 调用扩展函数
      • 1.1.2 扩展函数无法重载

1.1.1 从 Java 调用扩展函数

  1. 在编译器底层下,扩展函数是一种静态方法,它接受接收器对象作为第一个参数
    • 调用它不涉及创建适配器对象任何其他运行时开销
    • 这使得从 Java 使用扩展函数变得非常简单
      1. 调用静态方法传递接收器对象实例即可
    • 与其他顶级函数一样
      1. 包含该方法的 Java 类的名称声明该函数的文件名决定
      2. 关于顶级函数和顶级属性–传送门
    • <1> 比方说,lastChar扩展函数是在 StringUtil.kt 文件中声明的
      1. 那么在Java中调用时就需要使用"StringUtilKt"类名
      2. 关于如何使用JvmName注解修改类名–传送门
/* Java */
char c = StringUtilKt.lastChar("Java");    // <1>
  1. 该扩展函数被声明为顶级函数,因此编译为静态方法
    • <1> 可以从 Java 中静态导入 lastChar 方法
      1. 从而简化使用, 只需 lastChar(“Java”) 即可
      2. 注意使用的导入方式"import static xxx"
import static strings.StringFunctions.lastChar;   // <1>
public class Example {public static void main(String[] args){System.out.println(lastChar("Java"));       // <1>}
}
  1. 扩展函数的静态特性还意味着子类中不能重载扩展函数

1.1.2 扩展函数无法重载

  1. 在 Kotlin 中,方法重载与成员函数一样有效,但不能重载扩展函数
    • <1> 假设有两个类: View 和 Button
      1. Button 是 View 的子类,它重载父类中的 click 函数
    • <2> 要实现这一点,可以使用 open 修饰符标记View和click, 以允许重载
      1. 使用 override 修饰符在子类中提供一个实现
open class View {open fun click() = println("View clicked")       // <2>
}
class Button: View() {              // <1>override fun click() = println("Button clicked") // <2>
}
  1. 如果你声明一个 View 类型的变量
    • <1> 那么你就可以在该变量中存储 Button 类型的值
      1. 因为 Button 是 View 的子类型
    • <2> 如果在该变量上调用常规方法(如 click)
      1. 该方法在 Button 类中被重载,则将使用 Button 类的重载实现
fun main() {val view: View = Button()            // <1>view.click()                         // <2>// Button clicked                     
}
  1. 但对于扩展函数来说,情况并非如此
    • 扩展函数不是类的一部分,它们是在类的外部声明
    • 比如, 在 View 和 Button 类之外
      1. 定义 View.showOff() 和 Button.showOff() 扩展函数
        title
    • 即使可以为基类及其子类定义具有相同名称和参数类型的扩展函数
    • <1> 但调用的函数取决于变量声明的静态类型, 该类型在编译时确定
      1. 在对 view 变量调用 showOff 时,即使值的实际类型是 Button
        • 也会调用View类型的showOff方法,因为view变量的编译时类型是"View"
fun View.showOff() = println("I'm a view!")
fun Button.showOff() = println("I'm a button!")
fun main() {val view: View = Button()view.showOff()                      // <1>// I'm a view!
}
  1. 回忆一下上面所说的扩展函数在 Java 中被编译为静态函数
    • 接收器对象是第一个参数, Java 也会以同样的方式调用指定类型的扩展函数
/* Java */
class Demo {public static void main(String[] args) {View view = new Button();ExtensionsKt.showOff(view);// I'm a view!}
}
  1. 综上所述,如果类中的成员函数与扩展函数的签名相同,则成员函数总是优先
    • 集成开发环境也会警告您, 扩展函数已被成员函数覆盖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/148822.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

使用k8s部署RainLoop-Webmail

说明 * rainloop最新源码官方下载地址&#xff1a;https://www.rainloop.net/downloads/ * 系统要求&#xff1a;https://www.rainloop.net/docs/system-requirements/ * 安装文档&#xff1a;https://www.rainloop.net/docs/installation/ * 更多详细资料请查看官方文档 * do…

HDL coder使用手册

&#x1f4a1; 由于本科毕设女朋友准备使用FPGA完成&#xff0c;因此写这篇文章帮助她快速上手HDL coder的使用&#xff0c;降低前期入门的难度。 支持生成HDL代码的simulink库 名字中含有HDL的库中的模块一般都可以用来生成HDL代码。直接搜索模块名称&#xff0c;比如搜索fir&…

管道检测与识别系统源码分享

管道检测与识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

C++进阶学习——模版进阶

1. 非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当成…

寄大件快递用什么物流更便宜,寄20-200公斤大件价格对比

大件货物&#xff0c;大件行李&#xff0c;大件电器用什么物流快递更便宜呢&#xff1f; 新生入学&#xff0c;放寒暑假&#xff0c;新单位入职&#xff0c;搬家换工作的时候&#xff0c;都会遇到大件行李货物要邮寄的情况。这些都属于物流中的寄大件服务&#xff0c;在快递费…

隐私计算相关知识

WOE&#xff08; Weight of Evidence&#xff09;编码 一种在数据分析&#xff0c;尤其是信用评分和欺诈检测等领域中常用的特征编码方法。它的主要目的是将分类变量转换为数值变量&#xff0c;从而使得模型能够更好地理解类别与目标变量之间的关系 IV&#xff08; Informatio…

大数据毕业设计选题推荐-网络电视剧收视率分析系统-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、PHP、.NET、Node.js、GO、微信小程序、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇…

如何在平板电脑上用谷歌浏览器观看高清视频

在数字时代&#xff0c;使用平板电脑观看高清视频已成为一种流行的娱乐方式。Google Chrome浏览器因其快速、简洁和兼容性强的特点&#xff0c;成为许多用户的首选。本文将指导您如何在平板电脑上设置和使用Chrome浏览器来享受高清视频内容&#xff0c;同时融入一些提升浏览体验…

沃尔玛、亚马逊、Temu提升产品曝光度的实用技巧:测评补单

在当今竞争激烈的市场环境中&#xff0c;对于一家新开店铺或新上市产品而言&#xff0c;快速实现销量增长往往是一项艰巨的挑战。由于缺乏初始的市场认可&#xff0c;潜在消费者通常会对新品牌或产品产生犹豫。因此&#xff0c;提升店铺和产品的曝光率是实现快速出单的首要任务…

文档加密,如何设置?加密文档的10个小妙招值得参考!(电脑文件安全加密)

文档加密&#xff0c;如何设置&#xff1f; 是不是经常担心电脑里的重要文件被人偷看&#xff1f;别担心&#xff0c;学会这几招加密小技巧&#xff0c;就能给文件穿上"隐形衣"。不管是个人隐私还是公司机密&#xff0c;都能得到妥善保护。 接下来&#xff0c;咱们…

数组组成的最小数字 - 华为OD统一考试(E卷)

2024华为OD机试&#xff08;E卷D卷C卷&#xff09;最新题库【超值优惠】Java/Python/C合集 题目描述 给定一个整型数组&#xff0c;请从该数组中选择3个元素组成最小数字并输出(如果数组长度小于3&#xff0c;则选择数组中所有元素来组成最小数字)。 输入描述 一行用半角逗号…

2024年陕西省安全员B证证模拟考试题库及陕西省安全员B证理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年陕西省安全员B证证模拟考试题库及陕西省安全员B证理论考试试题是由安全生产模拟考试一点通提供&#xff0c;陕西省安全员B证证模拟考试题库是根据陕西省安全员B证最新版教材&#xff0c;陕西省安全员B证大纲整理…

中国可观测日「成都站」圆满落幕

在数字化转型的大潮中&#xff0c;企业对于系统的稳定性和可靠性提出了更高的要求&#xff0c;而可观测性平台正是确保业务连续性的关键技术。9月20日&#xff0c;中国可观测日成都站的活动圆满落幕&#xff0c;为技术专家们提供了一个宝贵的平台&#xff0c;深入探讨了可观测性…

【BetterBench博士】2024年华为杯E题:高速公路应急车道紧急启用模型 Python代码实现

题目 【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 E题&#xff1a;高速公路应急车道紧急启用模型 问题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 C题&#xff1a;数据驱动…

【Transformers基础入门篇4】基础组件之Model

文章目录 一、Model简介1.1 Transformer1.2 注意力机制1.3 模型类型 二、Model Head2.1 什么是 Model Head2.2 Transformers中的Model Head 三、Model基本使用方法3.0 模型下载-浏览器下载3.1 模型加载与保存3.2 配置加载参数3.3 加载config文件3.2 模型调用3.2.1 带ModelHead的…

*C++:string

一.STL简介 1.STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 。 2.STL六大组件 二.标准库里的string类 标准string库网址&#xff1…

朴世龙团队《Global Change Biology 》研究成果!揭示生物累积效应对秋季叶片衰老的重要调节作用!

本文首发于“生态学者”微信公众号&#xff01; 在全球气候变化的背景下&#xff0c;生态系统的季节性变化&#xff0c;尤其是植物的春季叶片展开和秋季叶片衰老&#xff08;EOS&#xff09;&#xff0c;对碳循环和区域气候调节起着至关重要的作用。然而&#xff0c;关于秋季叶…

腾讯云点播及声音上传

文章目录 1、开通腾讯云点播2、获取腾讯云API密钥3、完成声音上传3.1、引入依赖3.2、参考&#xff1a;接入点地域3.3、参考&#xff1a;任务流设置3.4、首先修改配置&#xff1a;3.4.1、 3.5、TrackInfoApiController --》 uploadTrack()3.6、VodServiceImpl --》 uploadTrack(…

计算存款利息-C语言

1.问题&#xff1a; 假设有本金1000元&#xff0c;想存一年&#xff0c;有三种方法可选择&#xff1a; A活期&#xff0c;年利率为0.0036&#xff1b; B一年期定期&#xff0c;年利率为0.0225&#xff1b; C存两次半年定期&#xff0c;年利率为0.0198。 请分别计算出一年后…

帮13岁小孩哥2分钟完成开发,这位AI程序员究竟是何方神圣?

通义灵码再升级&#xff0c;真AI程序员来了 随着通义系列基础模型能力的全面提升&#xff0c;各个具体领域的应用模型也随之飞升。这次在云栖大会上迎来重磅升级的&#xff0c;就包括用于代码生成的通义灵码。 一年前的通义灵码还只能完成基础的辅助编程任务&#xff0c;很难…