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

news2024/11/15 8:44:49

什么是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.coloradmin.cn/o/505289.html

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

相关文章

使用OpenCV部署全景驾驶感知网络YOLOP

开源项目 MCnet 是一个神经网络模型,用于实现车辆视觉感知的任务,比如车道线检测、行驶区域分割和物体检测等。MCnet 的全称是 Multitask CNN,它在单个神经网络模型中集成了多个任务的网络结构,可以同时对输入图像进行多个任务的…

Day964.从持续构建到持续集成 -遗留系统现代化实战

从持续构建到持续集成 Hi,我是阿昌,今天学习记录的是关于从持续构建到持续集成的内容。 如何修改后的代码可以“火速”部署到生产环境里,这样才能提高整个端到端的交付效率,让每次改动工作都能及时得到反馈,尽快验证…

看火山引擎DataLeap如何做好电商治理(二):案例分析与解决方案

接上篇,以短视频优质项目为例,火山引擎DataLeap平台治理团队会去对每天发布的这种挂购物车车短视频打上标签,识别这些短视频它是优质的还是低质的,以及具体原因。一个视频经过这个模型识别之后,会给到奖惩中心去做相应…

聊一聊 用 dotnet-trace 调查 lock锁竞争

一:背景 1. 讲故事 最近在分析一个 linux 上的 dump,最后的诱因是大量的lock锁诱发的高频上下文切换,虽然问题告一段落,但我还想知道一点信息,所谓的高频到底有多高频?锁竞争到底是一个怎样的锁竞争&…

将训练好的模型保存在服务端的三种办法

刚刚在完善我书中第七章案例的文档时,需要将训练好的模型存储在服务端,方便小伙伴们来使用该模型,这里我提供三种办法: 直接从我的个人网站中加载;通过python启动一个文件下载服务器;使用微信小程序云存储…

windows10+detectron2完美安装教程

文章目录 前言下载detectron2安装Visual Studio 2019修改代码 前言 需要下载detectron2的github项目,安装vs2019 (强烈建议这个版本,其他的版本需要做更多地操作才能成功安装),默认其他环境没问题。 下载detectron2 链接:https…

【来点小剧场--爪哇岛寻宝】java实现网络编程,写一个简易的回显服务程序

作者:困了电视剧 专栏:《JavaEE初阶》 文章分布:这是一篇关于网络编程的文章,在这篇文章中我会剖析一段回显服务程序的执行步骤和代码编程,希望对你有所帮助! 目录 客户端 服务端 总结 客户端 现在我们…

Postman完全卸载步骤

一、卸载应用程序 我们首先正常右键点击卸载通过windows程序卸载功能来卸载postman应用程序。 二、删除文件 (1)删除AppData》Roadming下的postman文件夹 (2)删除AppData》Roadming》\Microsoft\Windows\Start Menu\Programs下的p…

态势感知与信质、信量

未来的新智能是人机环境系统智能,而人机融合的态势感知是其关键,简单地说,态势感知(situation awareness)就是智能体在“一定时间和空间环境中的元素的感知,对它们的含义的理解,并对他们稍后状态…

uni——调用子组件失败解决方法($nextTick)

案例说明 调用子组件内的方法或者属性赋值报错的 this.$refs.goodsOrder.list [ ]解决代码 在外层包裹this.$nextTick(() > { 数据 }) this.$nextTick(() > {this.$refs.goodsOrder.list [] })

【JAVA面试】JVM

提示:文章先作为初版,等后续时间充足后,补充更深的内容 文章目录 JVM一、垃圾回收算法二、什么是STW三、JVM参数四、JVM内存模型 JVM 一、垃圾回收算法 JVM中的垃圾回收算法可以分为两种类型:基于引用计数的垃圾回收算法和基于可…

国考省考行测:数字推理题,趋势平缓作差,趋势陡峭看平方乘积,根号数列平方,分数小数拆开看

国考省考行测:数字推理题,趋势平缓作差,趋势陡峭看平方乘积,根号数列平方,分数小数拆开看 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考…

【Unity3D】Shader变体管理流程-变体剔除

一、什么是Shader变体管理 想要回答这个问题,要看看什么是Shader变体。 1. 变体 我们用ShaderLab编写Unity中的Shader,当我们需要让Shader同时满足多个需求,例如说,这个是否支持阴影,此时就需要加keyword(…

强化学习p1-基本概念

Terminologies(名词) 状态(State) 每个时刻,环境有一个状态 (state),可以理解为对当前时刻环境的概括 状态(State) 有时也被称为观测(Observation),因为有时智能体并不能观测到环境改变后的全部,只能观测到部分。 环境(Environm…

计算机毕业论文内容参考|软件工程|网络流量异常信息分析方法研究

文章目录 导文文章重点摘要前言绪论课题背景国内外现状与趋势课题内容相关技术与方法介绍技术分析技术设计技术实现总结与展望导文 网络流量异常信息分析方法研究 文章重点 摘要 本课题针对网络安全中网络流量异常的分析方法进行研究,提出一种基于机器学习和深度学习的异常检…

OpenCV教程——处理图像像素及图像掩膜

1.像素值 像素值是图像被数字化时由计算机赋予的值,代表了图像中某一小方块(即【像素点】)的平均亮度信息。 灰度图像通常用8位表示一个像素,这样总共有256个灰度等级(像素值在0~255之间)。 …

最值得推荐的免费分区管理软件

磁盘管理是 Windows 的内置工具,用于操作硬盘上的分区,但自 Windows XP 以来直到Windowa11 该程序几乎没有变化。个人测试了五个备选方案,以了解它们之间的比较。 奇客分区 默认的分区个数根据磁盘大小?需要重新划分分区&#xf…

2023/5/8总结

JAVA基础知识(2) 1.方法 1、方法定义 格式:public static void 方法名(){ //方法体 } 2、方法调用 格式:方法名(); 3、方法的通用格式 public static 返回值类型方法名&…

Camtasia2023官方中文版免费下载

在现在的网络互联网时代,越来越多的人走上了自媒体的道路。有些自媒体人会自己在网络上录制精彩视频,也有一些人会将精彩、热门的电影剪辑出来再加上自己给它的配音,做成大家喜欢看的电影剪辑片段。相信不管大家是自己平时有独特的爱好也好、…

【机组组合】基于数据驱动的模型预测控制电力系统机组组合优化【IEEE24节点】(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…