8:kotlin 类型检查和转换(Type checks and casts)

2023-11-25 19:01

本文主要是介绍8:kotlin 类型检查和转换(Type checks and casts),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在运行时可以执行类型检查以检查对象的类型。类型转换将对象强制转换为不同的类型

is!is

可以使用is或者!is来判断实例是不是指定的类型

fun main() {var obj : Any = "cast"if (obj is String) {println(obj.length)   // 4}obj = 123if (obj !is String) { print("Not a String") // Not a String} else {println(obj.length)}
}

智能转换

正常情况下,当使用了is或者!is判断实例类型时,如果返回的是true则会自动转成相应的类型,不需要再显示的进行类型转换了

fun main() {var obj : Any = "cast"if (obj is String) {println(obj.length)   // 4}
//    println(obj.length)   // 报错 - Unresolved reference: lengthif (obj !is String) returnprintln(obj.length)
}
fun main() {val x : Any = ""if (x !is String || x.length == 0) returnif (x is String && x.length > 0) {print(x.length) }
}

when中使用

when (x) {is Int -> print(x + 1)is String -> print(x.length + 1)is IntArray -> print(x.sum())
}

注意,只有当编译器能够保证变量在检查和使用之间不会改变时,智能强制转换才会起作用。

只能转换在一下场景生效

变量类型说明
var 本地变量一般都会生效,除了局部委托变量
var 类属性如果属性是私有的、内部的,或者检查是在声明属性的同一模块中进行的,那么可以使用智能转换。但是,智能转换不能用于开放属性或具有自定义 getter 的属性。
val本地变量如果变量在检查和使用之间没有被修改,没有被修改它的 lambda 捕获,也不是本地委托属性,那么就可以使用这个变量。
val类属性永远不会,因为变量可以在任何时候被其他代码修改。

不安全的强制转换

不安全的强制转换通常会报错,使用as进行操作

fun main() {val str: Any = "cast"val s = str as Stringval i = str as Int  //报错 java.lang.ClassCastException: class java.lang.String cannot be cast to class java.lang.Integer
}

注意,不能使null转换成String类型,如果有null风险,需要添加?

fun main() {val str: Any? = nullval s1 = str as String?val s2 = str as String   // 报错 - java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String
}

安全的强制转换

如果要避免异常,可以使用as?,如果转换失败则返回null

fun main() {val str: Any? = nullval s = str as? Stringprintln(s)  // null
}

这篇关于8:kotlin 类型检查和转换(Type checks and casts)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/424437

相关文章

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤