Kotlin变量的类型转换简介

Android  Kotlin  2024年9月18日 am8:50发布2个月前更新 城堡大人
87 0 0

前言

简单记录一下Kotlin变量类型的转换,记录于此,方便自己查阅。

正文

如果将一种数据类型的值赋给另一种不同的数据类型的变量时,则需要进行数据类型转换

根据转换方式的不同,数据类型转换可分为两种:智能类型转换强制类型转换

类型检查

在类型转换前,为了避免异常,可以通过is来进行类型检测。

  1. is判断对象是否是某个类的实例。

  2. !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 ")
  1. 子类可以强转为父类

  2. 父类不可以强制为子类(抛出异常)。

并不是所有的都可以强制转换,不支持的会抛出异常。

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。

参考文章

  1. 《Kotlin从基础到实战》

 历史上的今天

  1. 2021: 麦芒:生活与危机(0条评论)
  2. 2019: 里柯克:吃饼冠军乔.布朗(0条评论)
  3. 2018: Fragment的简单使用(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

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...