前言
简单记录一下Kotlin中变量类型的转换,记录于此,方便自己查阅。
正文
如果将一种数据类型的值赋给另一种不同的数据类型的变量时,则需要进行数据类型转换。
根据转换方式的不同,数据类型转换可分为两种:智能类型转换和强制类型转换。
类型检查
在类型转换前,为了避免异常,可以通过is来进行类型检测。
-
is判断对象是否是某个类的实例。
-
!is判断对象不是某个类的实例、
var mString:Any = "谷歌一下" if (mString is String) { Log.d(TAG, "is String ") } else { Log.d(TAG, "is not String ") }
is String
mString是String的实例。
var mString:Any = "谷歌一下" if (mString !is Int) { Log.d(TAG, "is not Int ") } else { Log.d(TAG, "is Int ") }
is not Int
mString不是Int的实例。
智能类型转换
Kotlin编辑器可以自行判断对象类型,然后进行转换。
拿上面例子来说
var mString:Any = "谷歌一下" if (mString is String) { Log.d(TAG, "is String ") } else { Log.d(TAG, "is no String ") }
虽然mString定义为Any类型,但mString最终还是判断为String的实例。这个就是编辑器自动进行转换的。
所以在Kotlin中,我们可以省略定义的类型。比如
// Int类型变量 var mNumber = 1
编译器会自动推断为Int
强制类型转换
当在某些特殊情况下无法进行智能类型转换时,还可以进行强制类型转换。
通过as操作符进行强制类型转换。
open class Person { } class Student : Person() { }
var student = Student() var person = student as Person Log.d(TAG, "test 1 : $person ")
-
子类可以强转为父类
-
父类不可以强制为子类(抛出异常)。
并不是所有的都可以强制转换,不支持的会抛出异常。
var mInt = 1 var mString = mInt as String Log.d(TAG, "test: $mString")
运行后crash了
Caused by: java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
如果不确定是否可以强制转换,可以使用as?
var mInt = 1 var mString = mInt as? String Log.d(TAG, "test: $mString")
输出结果
test: null
类型不兼容,使用 as? 运算符就会返回null。
参考文章
历史上的今天
暂无评论...
随机推荐
Android Studio将lib项目打包成jar和aar
jar包和aar包的区别jar包只包含class文件,不包含资源文件。aar包包含class文件和资源文件。aar生成及引用Android Studio编译lib库会在build/outputs/aar目录生成aar,有两个一个debug一个release。(至于这两个区别,我没有深入...
高鸿:读书是一种信仰
夜深人静的时候,阅读是一种享受。明代文学家陈继儒有诗云:“闭门即是深山,读书随处净土。”我明白读书是一种爱好、一种境界,是强求不来的幸福。我常去单位的后山公园看书。读到一首好诗、一篇佳作,不仅能引起人会心的微笑,还使人有茅塞顿开之感。这种美好的读书乐趣,不会因年长而减色。“世事沧桑心事定,胸中海...
Android 换肤setFactory2时出现No field mFactorySet in class问题解决
前言Android换肤插件开发时,需要依赖LayoutInflater.Factory类,在Android P和 之前版本都测试ok,但放在Android Q(10)上测试就失效了。本文记录一下失效的原因和解决的方法。正文在Android Q之前版本,通过如下代码可以设置的 try {...
Android多线程介绍
前言记录一下Android主线程,子线程等相关知识。我们知道Android3.0后如果在主线程进行网络请求是会抛出异常的,这是为了避免主线程被耗时操作阻塞从而导致ANR。因此有必要学习一下子线程相关知识。正文搞懂什么是线程前,也需要搞懂什么是进程。什么是进程进程是操作系统结构的基础。...
Kotlin的基本语法2
前言记录一下Kotlin基本语法2,主要涉及选择结构语句,循环结构语句和区间等,记录于此,方便自己查阅。正文选择结构语句选择结构语句分为if条件语句和when条件语句。if条件语句if条件语句分为3种语法格式。if语句if语句是指如果满足某种条件,则进行该条件下的某种处理。var...
init的启动
前言init的启动之前也跟过,目前用的是Android P,可能跟之前的存在一定的差异。因此重新记录一下,方便自己查阅。这里只是走走流程,大部分内容来之《Android P (9.0) 之Init进程源码分析》正文涉及文件,没出现顺序。\system\core\init\init.c...