空类型转换
fun getName(): String?{
return null
}
fun main(args: Array<String>) {
val name = getName()
//为什么报错,因为kotlin不支持空类型
println(name.length)
//?就是我知道他是空类型,然后我让他执行这个空类型,这就是类型安全转换
println(name?.length)
}
空类型安全转换也可以这样写,这样的写法哪怕你写的是空对象编译器也会继续编译成功,不会直接编译失败
这是另外一种安全转换的写法,当出现需要这种方式获取长度时候就可以获取其字符串的长度
fun main(args: Array<String>) {
/* val name: String = getName()?: return
//为什么我又不报错了? 因为?表达的意思就是我前面的表达式如果为空就继续执行,不会报错
println(name.length)*/
val value: String ?= "dsdsadasda"
//这种情况也无法获取其长度,该怎么办呢?
/* println(value.length)*/
//这样的写法就是告诉编译器我知道这样写不行,但是你只管执行,然后它就能直接获取到这个字符串的长度了
println(value!!.length)
}
智能类型转换
fun main() {
//这就是智能转换
//Chlid2为父类,Parent2继承它的父类,
//这是向下转型,父类对象的类型是子类
//这是实例化父类的对象,我现在是拿不到子类中方法的,如何去拿到呢?
val chlid2 : Chlid2 = Parent2()
//通过这个判断,它的意思就是说我的chlid2是Parent2实例
/*if (chlid2 is Parent2)*/
//这样就拿到子类中的方法了
println(chlid2.name())
}
首先我的父类实例化对象是拿不到子类中的方法的,呢要如何拿到呢?
通过智能转换就可以去实现子类方法
这是我子类中定义的方法:
我通过智能转换,就可以实现父类实例化对象拿到子类的方法
fun main() {
//这就是智能转换
//Chlid2为父类,Parent2继承它的父类,
//这是向下转型,父类对象的类型是子类
//这是实例化父类的对象,我现在是拿不到子类中方法的,如何去拿到呢?
val chlid2 : Chlid2 = Parent2()
//通过这个判断,它的意思就是说我的chlid2是Parent2实例
if (chlid2 is Parent2) //其放在java中就需要强转,这样 is 就是说它是不为空的类型就不需要强转了
//这样就拿到子类中的方法了
println(chlid2.name())
}
最终返回的结果就是子类中的呢个方法
## 还有比如
**//:: Kotlin 中 双冒号操作符 表示把一个方法当做一个参数,传递到另一个方法中进行使用,通俗的来讲就是引用一个方法。
//使用 !! 时,会对对象进行非空判断,并且会像 java 代码一样抛出异常。
//?对象A ?: 对象B 表达式,意思为,当对象 A值为 null 时,那么它就会返回后面的对象 B。**
val top :String? = "hello"
println(top.length) //我直接获取长度是获取不到的,因为编译器不能信任这句话我们可以通过下面这个判断
//我告诉编译器它是这个可以信任的类型,就可以编译成功
if (top is String){
println(top.length)
}
## 这就是另外一种智能类型转换
## 智能类型转换——安全转换操作方式
/*
* 智能转换安全,转换时不会抛出异常,如果没有加as?它会抛出类型转换异常,但是如果加了as?它会直接抛出null并不会抛出异常
* */
val ch:Chlid2 = Chlid2()
val par:Parent2? = ch as? Parent2 /**/
println(par)
这段代码返回的结果为null