kt:reified和sam转换(Single Abstract Method Conversions)

news/2024/5/12 3:33:04/文章来源:https://blog.csdn.net/weixin_42682455/article/details/130577502

什么是refied关键字
​由于我们都知道Kotlin和Java一样都存在着泛型擦除问题,而Kotlin它知道Java所带来的这个问题,所以对此Kotlin留了一个后门,就是通过inline函数保证使得泛型类的类型实参在运行时能够保留,这样的操作 Kotlin 中把它称为实化,对应需要使用 reified 关键字。而 reified意为具体化,使得(抽象的东西)变得更加具体化,它是Kotlin所增强的一种泛型的使用方式;

当然,使用reified关键字必要条件如下:

必须是 inline 内联函数,使用 inline 关键字修饰;
泛型类定义泛型形参时必须使用 reified 关键字修饰;


reified背后的故事
​ 既然我们知道reified和inline函数是相辅相成的,使用inline函数的最大一个好处就是函数调用的性能优化和提升,需要注意的是reflied使用 inline 函数并不是因为性能的问题,而是另外一个好处它能使泛型函数类型实参进行实化,在运行时能拿到类型实参的信息,相当于带实化参数的函数每次调用都生成不同类型实参的字节码,动态插入到调用点。由于生成的字节码的类型实参引用了具体的类型,而不是类型参数所以不会存在擦除问题;

综上所述,这也是为啥reifiied关键字必须使用inline关键字修饰的原因。换句话说,使用reifled可以保证泛型类的类型实参可以在运行中被保留,由于是具体的参数类型,可有效避免了泛型擦除的问题。

sam转换

在Kotlin中,SAM的概念其实是从Java那边追溯过来的,在Java中,我们把单一方法的接口叫做SAM(Single Abstract Method)接口,从Java8之后通过Lambda可以大大简化对于SAM接口的调用。所以SAM就代表的是单一抽象方法,“SAM类型”是指像Runnable,Callable等接口;Lambda表达式其实就可以被认为是SAM类型,可以自由转换为它们。

示例:(谱写Kotlin面试指南三部曲-基础篇 - 掘金,个人实测不行)

fun main() {//方案一:匿名类对象buyCar(object : IBuy {override fun onBuy(money: Double) {println("buyCar:$money")}})//方案二:SAM构造方法buyCar(IBuy {println("BuyCar:$it")})//方案三:SAM构造方法(推荐)buyCar({println("BuyCar:$it")})//方案四:SAM构造方法(推荐)buyCar {println("BuyCar: $it")}
}//买一辆一千万的车
fun buyCar(buy: IBuy) {buy.onBuy(10000000.0)
}fun interface IBuy {fun onBuy(money: Double)
}

因此,我们借助Lambda表达式对SamType调用的优化称为SAM转换(Single Abstract Method Conversions),Kotlin对此已经兼容了Java中的SAM转换,它只是将Java的SamType翻译成了Lambda,因此在kotlin的同名方法实际变成了一个高阶函数。

个人实测报错

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git简介和使用、基础命令

文章目录 一、git的安装与配置二、Git工作区原理三、Git的使用和仓库的创建四、Git的常用操作五、配置公钥六、IDEA中配置Git 一、git的安装与配置 https://tortoisegit.org/ 下载对应版本安装即可 注意:配置中输入邮箱和密码一定要和自己的git账户一致 git的配置…

copilot 逆向

原文: copilot-explorer | Hacky repo to see what the Copilot extension sends to the server 对我来说,Github Copilot 极其有用。它经常能神奇地读懂我的想法并给出有用的建议。最让我惊讶的是,它能够从周围的代码中正确地“猜测”出函数…

设计模式 -- 备忘录模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

电脑cpu占用率高?怎么办?1分钟快速解决!

案例:电脑cup过高怎么办? 【我的电脑运行缓慢,导致我学习和工作的效率很低。刚刚查看了一下电脑,发现它的cpu占用率很高。有没有小伙伴知道如何解决此电脑cpu过高的问题?】 电脑是我们生活中不可缺少的工具&#xff…

1— .Net MVC之控制器

在上下文中使用的控制器 问题 答案 什么是控制器? 控制器包含用于接收请求、更新应用程序状态或模型以及选择将发送给客户端的响应的逻辑 控制器有什么用? 控制器是MVC项目的核心,并包含Web应用程序的逻辑 如何使用控制器? …

接口自动化测试神器:Python+Requests+Unittest让你的测试用例飞起来

B站首推!2023最详细自动化测试合集,小白皆可掌握,让测试变得简单、快捷、可靠 随着互联网的发展,越来越多的应用程序采用了分布式架构,并通过API接口进行数据交换。因此,接口自动化测试已经成为了保证软件质…

过滤器对前端请求参数进行解码URLDecoder,接口接收参数类型为map,解码无效问题

文章目录 一、前言二、设计思路三、代码实现四、启动测试五、过滤器解码无效六、源码跟踪七、解决方案八、再次重启测试九、总结 一、前言 最近做的一个公司项目,因为客户需要对特殊字符做搜索,但是前端的请求参数无法传递到后端,所以前端对…

光耦继电器和普通继电器的区别概述

光耦继电器和普通继电器都是电气传感器元件中的一种,其都能够将电能转化成机械能,并实现各种开关控制和保护控制。但光耦继电器与普通继电器最大的区别在于其输入电路与输出电路之间通过光电转换器件,而不是实现物理接触。本文将从结构、工作…

Spring MVC——Rest风格

REST(Representational State Transfer) 当我们想表示一个网络资源的时候,可以使用两种方式: 我们分别用查询id为1的用户信息与保存用户信息举例传统风格资源描述形式 http://localhost/user/getById?id1http://localhost/user/saveUser RES…

记一次azkaban调度异常处理

一、背景 预发布环境使用的数据库性能比较低,根据业务测试的需求,需要将数据库更换成 稳定高性能的数据库。更换业务数据库后azkaban定时任务失败 二、数据库服务信息 说明:该部分使用代号来代替,非真实信息 该数据库存储了azka…

linux彻底卸载mysql步骤

第一步,先查看是否安装了mysql mysql -u root -p 如果提示bash: mysql: command not found...则没有安装过mysql 如果提示需要输入密码,那就证明安装了mysql 第二步,查看mysql运行状态并关闭 先查看下mysql的运行状态(如果已经…

电脑缺少msvcp140.dll怎么办,缺少msvcp140一键修复方法

电脑缺少msvcp140.dll怎么办?这个问题相信不少小伙伴都遇到过,msvcp140.dll文件是很多软件跟游戏运行必须用到的文件,如果丢失或者损坏,很多软件都会无法打开运行。其实知道知道方法,修复起来其实也不会很难&#xff0…

OAK相机如何将 YOLO NAS 模型转换成blob格式?

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…

k8s pv pvc的使用

k8s pv pvc的使用 安装nfs服务器 yum install rpcbind nfs-utils -y systemctl enable rpcbind systemctl enable nfs systemctl start rpcbind systemctl start nfsmkdir -p /root/data/sc-data [rootmaster sc-data]# cat /etc/exports /root/data/sc-data 192.168.1.0/24(…

运营商三要素验证原理,这篇文章就够了!

引言 运营商三要素验证 API 是一种基于手机号码、身份证号码和姓名等三种信息的验证服务,主要用于验证用户身份信息的真实性和一致性,以及查询手机号码所属的运营商信息。 运营商三要素 API 的验证原理 1. 身份验证的原理 身份信息验证是运营商三要素…

系统安全分析与设计

目录 第五章、系统安全分析与设计1、信息系统安全属性2、对称加密技术与非对称加密技术3、信息摘要4、数字签名5、数字信封与PGP6、网络安全6.1、各个网络层次的安全保障6.2、网络威胁与攻击6.3、防火墙 第五章、系统安全分析与设计 1、信息系统安全属性 安全属性 保密性&…

JavaScript实现求1-100之间不能被3整除的数之和,求100以内偶数的和的两个程序代码

以下为实现求1-100之间不能被3整除数之和求100以内偶数的和的两个程序代码和运行截图 目录 前言 一、实现输入两个数比较两个数的大小 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 二、求100以内偶数的和 2.1 运行流程及思想 2.2 代码段 2.3…

北峰通信,用专业打造“全方位、立体化”应急通信保障体系

最近热映的电影《惊天救援》里,杜江饰演的消防员韩凯,在一次化工园区发生爆炸后,他作为消防救援站里的通信员,第一时间奔赴重灾区,及时将第一现场的情况传到了后方指挥部。 众所周知,通讯系统是生命线系统的…

685页40万字某省市场监管智慧应用一体化项目(word可编辑)

1.2.3.1 数字XX公共能力建设现状 1.2.3.1.1 数字XX通用基础应用平台现状 通用基础应用平台提供具有共性特征的跨部门、跨层级业务应用,与本项目有关的平台包括某省网上办事大厅、某省政务服务 APP 统一平台(X政通 APP)、某省公共信用信息平…

rk3568 修改开机logo

rk3568 修改开机显示logo Android 显示 logo 的作用是为了标识应用程序或设备的品牌和身份。在应用程序中,logo 可以帮助用户快速识别应用程序,并与其他应用程序区分开来。在设备中,logo 可以帮助用户识别设备的品牌和型号,以及与…