当前位置: 首页 > news >正文

Kotlin中reified 关键字

前言

在开始之前,让我们先讨论一下泛型。泛型用于为类、函数或接口提供通用的实现。下面是一个示例泛型方法:

fun <T> displayValue(value: T) {println(value)
}fun main() {displayValue<String>("Generics")displayValue<Int>(10)
}

在上面的代码中,你可以传递任何类型的数据给 displayValue 方法。现在让我们尝试打印出 T 的类型。运行以下代码并查看输出:

fun <T> displayValue(value: T) {println(value)println("Type of T: ${T::class.java}")
}fun main() {displayValue<String>("Generics")displayValue<Int>(10)
}

在执行上述代码后,你将会看到以下错误信息:

Cannot use 'T' as reified type parameter. Use a class instead.

这是因为和 Java 一样,在 Kotlin 中,当你使用泛型时,类型信息会在编译时被擦除。这个过程被称为类型擦除。例如,如果你有一个 List<String>,在运行时,它只被视为普通的 List,没有任何关于其类型参数的知识。

这意味着你无法在运行时执行诸如检查对象是否为泛型类型之类的操作。

为了解决这个问题,我们需要在泛型函数中传递类型信息,如下所示:

fun <T> displayValue(classType: Class<T>, value: T) {println(value)println("Type of T: $classType")
}fun main() {displayValue<String>(String::class.java, "Generics")displayValue<Int>(Int::class.java, 10)
}

为了避免编写上述样板代码,kotlin 提供了 reified 关键字来在运行时访问类型。我们看下面的代码

inline fun <reified T> displayValue(value: T) {println(value)println("Type of T: ${T::class.java}")
}fun main() {displayValue<String>("Generics")displayValue<Int>(10)
}

关键字reified

关键字 reified 可以让你在运行时访问在代码编译期间应该被擦除的类型信息。reified 关键字使用内联函数来执行这个任务。

如果一个函数被标记为 inline,那么无论在哪里调用该函数,编译器都会将整个函数体直接粘贴到调用处。

除了上述用例,使用 reified 还可以做其他一些事情。例如,我们可以使用相同参数和名称但返回类型不同的函数。比如,我想写一个根据分数返回不同数据的函数:

ifun displayData(marks: Int): Int { return marks 
} fun displayData(marks: Int): String { return "Congratulations! you scored more than 90%"; 
}

上面的重载函数会报错,因为函数重载要求参数的数量或类型不同,而不是返回类型不同。

为了解决这个问题,我们可以使用 reified 关键字重构上述函数:

inline fun<reified T> displayData(marks: Int): T {return when (T::class) {Int::class -> marks as TString::class -> "Congratulations! you scored more than 90%" as Telse -> "Please enter valid type" as T}
}
fun main() {val intMarks: Int = displayData(60)val stringMessage: String = displayData(95)println("$intMarks")println("$stringMessage")
}

reified限制

reified 类型参数的一个主要限制是它只能与内联函数一起使用。这种关联是由于 reified 类型通过在调用点内联函数的代码来保留类型信息。

reified 类型参数不能表示一些复杂或不可表示的类型。例如,你不能直接为类似 List<Int> 或 Array<String> 这样的类型使用 reified 参数。

inline fun <reified T> printList(list: List<T>) {// 对于像 List<Int> 这样的类型,这样的写法无法正常工作
}

reified 类型参数不能在某些情况下使用,例如作为非内联函数的类型参数、在对象声明中或作为类中的属性类型。

class SampleClass<reified T> { ... } // 这样是行不通的

相关文章:

Kotlin中reified 关键字

前言 在开始之前&#xff0c;让我们先讨论一下泛型。泛型用于为类、函数或接口提供通用的实现。下面是一个示例泛型方法&#xff1a; fun <T> displayValue(value: T) {println(value) }fun main() {displayValue<String>("Generics")displayValue<…...

Linux命令(95)之alias

linux命令之alias 1.alias介绍 linux命令alias是用来将/bin目录下的命令进行别名设置&#xff0c;将一些较长的命令进行简化。 alias命令的作用只局限于该次登入的操作&#xff0c;相当于临时变量。 如果对当前用户永久生效&#xff0c;需修改~/.bashrc文件&#xff0c;使用…...

DHCPsnooping 配置实验(2)

DHCP报文泛洪攻击 限制接收到报文的速率 vlan 视图或者接口视图 dhcp request/ dhcp-rate dhcp snooping check dhcp-request enable dhcp snooping alarm dhcp-request enable dhcp snooping alarm dhcp-request threshold 1 超过则丢弃报文 查看[Huawei]dis dhcp statistic…...

Qt 综合练习小项目--反金币(2/2)

目录 4 选择关卡场景 4.2 背景设置 4.3 创建返回按钮 4.3 返回按钮 4.4 创建选择关卡按钮 4.5 创建翻金币场景 5 翻金币场景 5.1 场景基本设置 5.2 背景设置 5.3 返回按钮 5.4 显示当前关卡 5.5 创建金币背景图片 5.6 创建金币类 5.6.1 创建金币类 MyCoin 5.6.…...

安装matplotlib__pygame,以pycharm调入模块

安装pip 安装matplotlib 安装完毕&#xff0c;终端输入pip list检查 导入模块出现bug&#xff0c;发现不是matplotlib包的问题&#xff0c;pycharm版本貌似不兼容&#xff0c;用python编辑器可正常绘图&#xff0c;pygame也可正常导入。 ​​​​​​​ pycharm版本问题解决 终…...

编写可扩展的软件:架构和设计原则

在今天的软件开发领域&#xff0c;可扩展性是一个至关重要的概念。无论您是开发一个小型应用程序还是一个大规模的软件系统&#xff0c;都需要考虑如何使您的软件能够在不断变化的需求下进行扩展和演进。本文将探讨编写可扩展软件的关键架构和设计原则&#xff0c;以帮助开发人…...

算法-排序算法

0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序&#xff0c;由于其时间复杂度不能突破O(nlogn)&#xff0c;因此也称为非线性时间比较类排序。 非比较类排序&#xff1a;不通过比较来决定元素间…...

Android_Monkey_测试执行策略及标准

一、Monkey命令概述 NO命令说明用法解释1 -p ALLOWED_PACKAGE用于指定某个apk&#xff0c;可以使用多个-p选项&#xff0c;但是每个-p命令选项只能用于一个apk 如果不指定-p&#xff0c;Monkey就会默认进行全系统测试。 -p com.android.contacts可以进行特定apk的Monkey测试2 …...

windows安装nginx

官网提供的下载地址&#xff1a;nginx: download nginx1.25.2下载地址&#xff1a;http://nginx.org/download/nginx-1.25.2.zip 直接运行nginx.exe会闪退&#xff0c;我们还得使用cmd/git bash/power shell 命令进行启动&#xff1b; 个人更喜欢git bash&#xff1b; 运行命…...

Java日期的学习篇

关于日期的学习 目录 关于日期的学习JDK8以前的APIDate Date常用APIDate的API应用 SimpleDateFormatSimpleDateFormat常用API测试 反向格式化(逆操作)测试 训练案例需求(秒杀活动)实现 Calendar需求痛点常见API应用测试 JDK8及以后的API(修改与新增)为啥学习(推荐使用)新增的AP…...

spark on hive

需要提前搭建好hive&#xff0c;并对hive进行配置。 1、将hive的配置文件添加到spark的目录下 cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf2、开启hive的hivemetastore服务 提前创建好启动日志存放路径 mkdir $HIVE_HOME/logStart nohup /usr/local/lib/apache-hi…...

Linux Vi编辑器基础操作指南

Linux Vi编辑器基础操作指南 Linux中的Vi是一个强大的文本编辑器&#xff0c;虽然它有一些陡峭的学习曲线&#xff0c;但一旦掌握了基本操作&#xff0c;它就变得非常高效。以下是Vi编辑器的一些基本用法&#xff1a; 打开Vi编辑器&#xff1a; vi 文件名退出Vi编辑器&#xff…...

WEB3 创建React前端Dapp环境并整合solidity项目,融合项目结构便捷前端拿取合约 Abi

好 各位 经过我们上文 WEB3 solidity 带着大家编写测试代码 操作订单 创建/取消/填充操作 我们自己写了一个测试订单业务的脚本 没想到运行的还挺好的 那么 今天开始 我们就可以开始操作我们前端 Dapp 的一个操作了 在整个过程中 确实是没有我们后端的操作 或者说 我们自己就…...

rust运算

不同类型不能放在一起运算。如果非要计算&#xff0c;必须先强转成一个类型再运算。 一 、数字运算 &#xff08;一&#xff09;算术运算 a 10且b 5 名称运算符范例加ab的结果为15减-a-b的结果为5乘*a*b的结果为50除/a / b的结果为2求余%a % b的结果为0 Rust语言不支持自增…...

游戏引擎,脚本管理模块

编辑器中删除脚本&#xff0c;然后立即恢复删除的脚本关系正常编辑器中删除脚本&#xff0c;关掉编辑器&#xff0c;然后只恢复脚本&#xff0c;不恢复meta,然后再打开编辑器关系丢失编辑器中删除脚本&#xff0c;关掉编辑器&#xff0c;然后恢复脚本且恢复meta,然后再打开编辑…...

2023年7月工作经历三

年龄危机 传言&#xff1a;程序员干不过37岁&#xff0c;架构师干不过45岁&#xff0c;总监干不过55岁。我已经43岁了。当总监需要机遇&#xff1b;首下犯错&#xff0c;会扣领导工资&#xff1b;有的公司总监还需要出资。为了方便以后当总监&#xff0c;我还在超音速带过小团…...

1801_codesys产品主样本了解

全部学习汇总&#xff1a; GreyZhang/g_codesys: some codesys learning notes (github.com) 有些技术、学术的成长&#xff0c;氛围也是很重要的。我觉得工业控制&#xff0c;德国做得算是世界上很突出的。而这个巴伐利亚&#xff0c;更是突出中的佼佼者了。从这里的介绍看&am…...

flink的计时器

背景 在flink中&#xff0c;我们经常使用ontimer计时器实现很多逻辑的功能&#xff0c;常见的比如某个传感器温度增加连续超过1分钟的告警输出等&#xff0c;本文就来简单记录下计时器的作用 计时器 ontimer的定义 public void onTimer(long timestamp, OnTimerContext ctx…...

@SpringBootApplication剖析

一、前言 在SpringBoot项目中启动类必须加一个注解SpringBootApplication&#xff0c;今天我们来剖析SpringBootApplication这个注解到底做了些什么。 二、SpringBootApplication简单分析 进入SpringBootApplication源代码如下&#xff1a; 可以看出SpringBootApplication是…...

浅谈wor2vec,RNN,LSTM,Transfermer之间的关系

浅谈wor2vec&#xff0c;RNN&#xff0c;LSTM&#xff0c;Transfermer之间的关系 今天博主谈一谈wor2vec&#xff0c;RNN&#xff0c;LSTM&#xff0c;Transfermer这些方法之间的关系。 首先&#xff0c;我先做一个定位&#xff0c;其实Transfermer是RNN&#xff0c;LSTM&…...

微信灰度测试状态浏览功能引热议,“已读”“访客”功能为何“焊死”不开发?

微信状态灰度测试功能揭秘5月12日&#xff0c;微信员工“客村小蒋”和腾讯公关总监张军先后就微信状态灰测访客功能表态。原来&#xff0c;此次小范围测试包含两个功能&#xff0c;一是状态浏览人数展示&#xff0c;发布状态后&#xff0c;在有效期内可在右下角看到浏览人数&am…...

如何快速掌握LyricsX:macOS终极歌词同步工具完整指南

如何快速掌握LyricsX&#xff1a;macOS终极歌词同步工具完整指南 【免费下载链接】LyricsX &#x1f3b6; Ultimate lyrics app for macOS. 项目地址: https://gitcode.com/gh_mirrors/ly/LyricsX LyricsX是一款专为macOS设计的终极歌词应用&#xff0c;能够自动同步音乐…...

基于agent-foundry框架构建智能体:从核心原理到天气助手实战

1. 项目概述&#xff1a;从零构建你的智能体开发框架最近在GitHub上看到一个挺有意思的项目&#xff0c;叫hebertzhu/agent-foundry。乍一看名字&#xff0c;你可能会觉得这又是一个跟风大语言模型热潮的“又一个Agent框架”。但当我真正深入去研究它的代码结构、设计理念和实际…...

从好奇号火星着陆看复杂系统工程:天空起重机方案与工程管理启示

1. 项目概述&#xff1a;从“不可能”到“火星新地标”的工程壮举2012年8月6日&#xff0c;当“好奇号”火星车在盖尔陨石坑成功着陆&#xff0c;传回第一张火星地表照片时&#xff0c;整个喷气推进实验室&#xff08;JPL&#xff09;控制中心沸腾了。这不仅仅是一次成功的行星…...

MSP 盈利、留客、提口碑,核心就盯这12个 KPI

很多 MSP&#xff08;托管服务提供商&#xff09;都会陷入一个误区&#xff0c;手里握着一堆散落在各个看板的运营数据&#xff0c;却始终搞不清哪些指标能真正帮自己提升服务质量、拉高利润、留住客户。忙忙碌碌做了一堆报表&#xff0c;最终还是凭感觉做决策&#xff0c;业务…...

Cap框架解析:模块化开发者工具箱的设计哲学与核心实践

1. 项目概述&#xff1a;一个面向开发者的现代化软件工具箱最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“CapSoftware/Cap”。乍一看这个名字&#xff0c;可能会联想到“Cap”这个英文单词的多种含义——帽子、上限、或者电容的单位。但在软件开发的语境里&#xff0c…...

基于MCP协议与FFmpeg构建AI视频处理服务器:原理、部署与实战

1. 项目概述&#xff1a;一个面向视频处理的MCP服务器 最近在折腾一些AI应用&#xff0c;发现很多工具在处理视频内容时&#xff0c;总感觉差了那么一口气。要么是功能太单一&#xff0c;只能做简单的剪辑或转码&#xff1b;要么就是流程太复杂&#xff0c;需要把视频下载、处…...

【开盘预测】2026年5月13日(周三)

生成时间&#xff1a;2026-05-12 20:30 | 数据来源&#xff1a;金融市场数据 核心预测&#xff1a;市场震荡整理&#xff0c;关注4200-4250区间&#xff0c;量能变化是关键一、今日收盘总结指数收盘点涨跌幅关键技术位上证指数4214.49-0.25%失守4220&#xff0c;守在4200上方深…...

六、Ext系列文件系统(2)

...

企业微信消息发送踩坑实录:.NET Core下处理AccessToken过期与消息安全的最佳实践

企业微信消息发送实战&#xff1a;.NET Core中的AccessToken管理与消息安全策略 当企业微信API集成到生产环境时&#xff0c;开发者常会遇到两个看似简单却暗藏玄机的问题&#xff1a;AccessToken突然失效导致消息发送失败&#xff0c;以及敏感信息传输时的安全风险。本文将分享…...