kotlin类型检测与类型转换

一、is与!is操作符

1、使用  is 操作符或其否定形式 !is  在运行时检测对象是否符合给定类型。
fun main() {var a = "1"if(a is String) {println("a是字符串类型:${a.length}")}// 或val b = a is Stringprintln(b)
}

二、"不安全的"转换操作符 as 与 as String?

1、如果转换失败,转换操作符会抛出一个异常。kotlin中的不安全转换使用中辍操作符 as
fun main() {val a:String? = nullval b = a as Stringprintln(b)
}

输出: 

null 不能转换为String, 因为该类型不是可空的,如果转换时,不确定a是否可空(null),在类型转换的右侧使用可空类型进行转换:

fun main() {val a:String? = nullval b = a as String?println(b) // 输出 null
}

再来看一段代码: 

fun main() {// 会类型推断为 Int类型val a:Any = 1// Int类型转String 不管是否加了?都会抛出异常val b = a as String?println(b) 
}

 上边代码转换失败:

三、"安全的"可空转换操作符 as?

1、为了避免异常,还可以使用安全转换操作符 as? ,它可以在失败时,返回 null。
fun main() {val a:String? = nullval b = a as? Stringprintln(b) // 输出 null
}

四、总结

(1)as 转换操作符转换失败时,会抛出异常。
(2)as String? 转换 null时,不会抛出异常,会返回null,但是如果转换为别的类型,则会抛出异常。
(3)as? 转换失败时,不会抛出异常(比较抗霍霍)。

is底层,用脚想也能猜出来,应该是instanceof判断的,不会抛出任何异常:

boolean b = a instanceof String;

 as和as String? 底层都是强转为String类型,没有做任何处理,所以抛出异常理所应当:

String b = (String)a;

再来看下as?底层代码:

public static final void main() {Object a = 1;// 把a包装成 Integer(自动装箱)Integer var10000 = a;// 判断 a 是否是 String 的实例,由于 a 实际上是 Integer 类型(装箱的 1),// 这个条件总是 true,因此 var10000 被赋值为 nullif (!(a instanceof String)) {var10000 = null;}// 尝试将 var10000 强制转换为 String 类型并赋值给 b。// 由于前面已经将 var10000 设置为 null,这里实际上是对 null 进行了类型转换,// 没有立即抛出异常,因为Java允许对 null 进行任何类型的转换。String b = (String)var10000;boolean var2 = false;System.out.println(b);
}

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

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

相关文章

【面试手撕】CAS实现 线程安全的链表结构的栈

利用Atomic原子引用,采用CAS的方式,实现线程安全的链表栈的实现 关键点 关键在于用 AtomicReference原子类包装栈顶节点,在更改新的栈顶节点的时候,判断原子引用的栈顶是否还是之前获取时的栈顶,如果不是则重新通过Ato…

搜索是门艺术,大神都是这样找资源

以下所有资源均可在星云导航找到,网站地址:https://www.xygalaxy.com/ 浏览器搜索高级用法 1、排除干扰,指定关键词 1.1、排除指定关键字 格式:关键字1 -关键字2比如搜索:星云导航,不想要CSDN的内容 星…

Stable Diffusion 3 开源发布可下载体验

本文来自huggingface翻译 Stable Diffusion 3 Medium是一种多模态扩散变换器 (MMDiT) 文本到图像模型,其在图像质量、排版、复杂提示理解和资源效率方面的性能有极大提升。 有关更多技术细节,请参阅研究论文。 请注意:此模型是根据 Stabilit…

C# —— 条件运算符

条件运算符的作用: 用于比较两个变量或者常量 // > // < // // ! // > // < 条件运算符 一定存在左右两边的内容 左边内容 条件运算符 右边内容 int a 30; int b 50; 条件运算符 不…

java面试题:hashMap扩容机制

初始容量和加载因子&#xff1a; HashMap在初始化时有一个默认的初始容量&#xff08;capacity&#xff09;&#xff0c;通常是16。这个容量也可以在创建HashMap时通过构造函数指定。 HashMap还有一个加载因子&#xff08;load factor&#xff09;&#xff0c;这是一个表示Has…

【全开源】快递寄件小程序源码(FastAdmin+ThinkPHP+原生微信小程序)

&#x1f4e6;快递寄件小程序&#xff1a;轻松寄送&#xff0c;便捷生活 &#x1f69a;一、引言&#xff1a;告别繁琐&#xff0c;让寄件更简单 在繁忙的生活中&#xff0c;寄送快递往往成为我们的一大难题。传统的寄件方式需要前往快递公司网点&#xff0c;填写繁琐的寄件信…

单目标应用:基于蛇鹫优化算法SBOA的微电网优化(MATLAB代码)

一、微电网模型介绍 微电网多目标优化调度模型简介_vmgpqv-CSDN博客 参考文献&#xff1a; [1]李兴莘,张靖,何宇,等.基于改进粒子群算法的微电网多目标优化调度[J].电力科学与工程, 2021, 37(3):7 二、蛇鹫优化算法求解微电网 2.1算法简介 蛇鹫优化算法&#xff08;Secre…

基于python多光谱遥感数据处理、图像分类、定量评估及机器学习

原文链接&#xff1a;基于python多光谱遥感数据处理、图像分类、定量评估及机器学习 普通数码相机记录了红、绿、蓝三种波长的光&#xff0c;多光谱成像技术除了记录这三种波长光之外&#xff0c;还可以记录其他波长&#xff08;例如&#xff1a;近红外、热红外等&#xff09;光…

企业中的绩效管理

背景 企业中为何需要绩效管理&#xff0c;企业绩效管理为何比较难&#xff0c;这在企业管理中是非常难&#xff0c;同样也是非常有价值的命题&#xff0c;那么首先应该对这个命题有清晰的认知&#xff0c;特别是要想明白为何企业需要绩效管理&#xff0c;应该先明白企业。 企…

Uniapp实现页面滚动Tab吸顶,点击tab内容滚动到对应tab内容位置

1.template结构 <view class"content-tabs-box"><view class"content-tabs" :class"{is-fixed: isTabFixed}"><viewv-for"(item, index) in detailTabs" :key"index" class"tab" :class"{act…

【git使用四】git分支理解与操作(详解)

目录 &#xff08;1&#xff09;理解git分支 主分支&#xff08;主线&#xff09; 功能分支 主线和分支关系 将分支合并到主分支 快速合并 非快速合并 git代码管理流程 &#xff08;2&#xff09;理解git提交对象 提交对象与commitID Git如何保存数据 示例讲解 &a…

lnmp的介绍与源码部署以及 |什么是正向、反向、透明代理 | 常见的集群有哪些

lnmp 文章目录 lnmp1.LNMP是什么2. lnmp简介3.系统特点4.优点5.lnmp部署5.1 nginx安装5.2 mysql安装5.3 php安装5.4配置nginx服务处理php 6.扩展知识点1.什么是集群2.常见的集群有哪些集群的分类1、高可用集群2、负载均衡集群3、分布式计算集群4、高性能集群(High Performance …

TCP标志

SYN (Synchronize) 和 ACK (Acknowledgement) 是TCP协议中的两种重要标志&#xff08;flags&#xff09;&#xff0c;用于建立和维护连接。它们通常在TCP三次握手过程中使用。 1、SYN标志&#xff1a; 当客户端想要建立于服务器的TCP连接时&#xff0c;它会发送一个带有SYN白…

嵌入式常用调试方法

目录 调试工具 日志打印 1. Debug日志打印 2. RTT日志打印 3. 串口日志打印 总结 嵌入式系统的调试是一个复杂且关键的过程&#xff0c;涉及多种工具和技术的综合应用。以下是对嵌入式常见调试工具、日志打印方式的全面报告&#xff0c;包括Debug、RTT&#xff08;Real-T…

重生奇迹mu魔法师介绍

魔法师擅长&#xff1a;远距作战、攻击&辅助魔法使用 转职&#xff1a;魔导师&#xff08;2转&#xff09;&#xff0c;神导师&#xff08;3转&#xff09; 魔法师可以通过多样的魔法&#xff0c;展现华丽的效果和强大的实力。成长初期因为体力少&#xff0c;经常受到死亡…

Linux Shell命令vim使用

一、引例 以判断引出&#xff08;学过C其他语言容易接受&#xff09;。 简单命令说明&#xff1a; -e 测试文件是否存在 -f 测试文件是否为普通文件 -d 测试文件是否为目录 -r 测试当前用户对某文件是否具有“可读”权限 -w 测试当前用户对某文件是否具有“可写”权限…

线程池前置知识

并发和并行 并发是指在单核CPU上&#xff0c;多个线程占用不同的CPU时间片。线程在物理上还是串行执行的&#xff0c;但是由于每个线程占用的CPU时间片非常短&#xff08;比如10ms&#xff09;&#xff0c;看起来就像是多个线程都在共同执行一样&#xff0c;这样的场景称作并发…

Python私教张大鹏 Vue3整合AntDesignVue之Cascader 级联选择

何时使用 需要从一组相关联的数据集合进行选择&#xff0c;例如省市区&#xff0c;公司层级&#xff0c;事物分类等。 从一个较大的数据集合中进行选择时&#xff0c;用多级分类进行分隔&#xff0c;方便选择。 比起 Select 组件&#xff0c;可以在同一个浮层中完成选择&#…

聊聊C/S模式架构的优缺点

C/S模式架构&#xff0c;即客户端-服务器&#xff08;Client/Server&#xff09;架构&#xff0c;是一种常见的软件系统架构&#xff0c;以下是C/S模式架构的优缺点分析。 C/S架构优点部分&#xff1a; 性能高效&#xff1a;由于客户端直接与服务器进行数据交换&#xff0c;没…

关于创建Cloudeflare的r2桶以及如何使用rclone连接

一、名词解释 r2桶是cloudflare给用户的免费10G储存空间&#xff0c;可与自定义域创建链接的储存storge。 rclone是开源工具&#xff0c;用于在本地通过软件链接云储存storege&#xff0c;让用户可以修改、同步、删除云储存中的内容。 rcloneBrowser是rclone的GUI版本&#x…