在运行时可以执行类型检查以检查对象的类型。类型转换将对象强制转换为不同的类型
is
和 !is
fun main() {
var obj : Any = "cast"
if (obj is String) {
println(obj.length) // 4
}
obj = 123
if (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: length
if (obj !is String) return
println(obj.length)
}
fun main() {
val x : Any = ""
if (x !is String || x.length == 0) return
if (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 类属性 |
永远不会,因为变量可以在任何时候被其他代码修改。 |
不安全的强制转换
fun main() {
val str: Any = "cast"
val s = str as String
val 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? = null
val s1 = str as String?
val s2 = str as String // 报错 - java.lang.NullPointerException: null cannot be cast to non-null type kotlin.String
}
安全的强制转换
fun main() {
val str: Any? = null
val s = str as? String
println(s) // null
}
原文地址:https://blog.csdn.net/qq_40104261/article/details/134593584
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_2183.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。