目录
1、instanceof(类型检查)
2、is (类型检查)
3、as(类型强转)
4、as?
5、类型转换封装方法
1、instanceof(类型检查)
我们常会在Java中见到如下的代码:
我们拿到一个父类型Animal的对象时,会先用instanceof检查这个对象是否是我们想要的子类型Dog,如果是的话,然后就是对这个类型进行强转,然后再做Dog应该做的事情。
public class Test1 {public static void main(String[] args) {Animal animal=new Dog();if (animal instanceof Dog){Dog dog= (Dog) animal;dog.bark();}}
}
//输出结果
汪汪...open class Animal() {var name: String = "a"var age: Int = 3
}class Dog : Animal() {var color: String = "blue"fun bark() {println("汪汪...")}
}
2、is (类型检查)
那么Kotlin中怎么实现上面的类型检查呢?
那就是is关键字,而且当我们类型检查是Dog类型的时候,我们不再需要将Animal父类型强转成Dog子类型,Kotlin会帮我们自动转换成我们想要的类型。
我们看到编译后以后的代码,和我们前面Java代码是一样的,只是Koltin帮我们自动实现了这一步。
fun main() {val animal: Animal = Dog()if (animal is Dog) {animal.bark()}
}
//输出结果
汪汪...//编译后的Java代码public static final void main() {Animal animal = (Animal)(new Dog());dogBark(animal);}// $FF: synthetic methodpublic static void main(String[] var0) {main();}public static final void dogBark(@NotNull Animal animal) {Intrinsics.checkParameterIsNotNull(animal, "animal");if (animal instanceof Dog) {((Dog)animal).bark();}}
3、as(类型强转)
当然,我们有些情况是需要手动进行类型强转的,Koltin中进行类型强转的关键字就是as。
as?
fun main() {val animal:Animal=Dog()val dog:Dog= animal as Dog
}
4、as?
当 animal as Dog 中animal如果是null的话,会出现上面情况呢?那肯定是报错了?如下:
fun getDog(): Animal? {return null
}
fun main() {val animal: Animal ?= getDog()val dog:Dog= animal as Dogdog.bark()
}//异常信息
Exception in thread "main" kotlin.TypeCastException:
null cannot be cast to non-null type com.yobo.yobo_kotlin.test36.Dog
那么我们怎么解决这种异常呢?
那就是 as?可null的强转符号,如下:这样运行就不会报错了。
fun getDog(): Animal? {return null
}
fun main() {val animal: Animal ?= getDog()val dog:Dog?= animal as? Dogdog?.bark()
}
5、类型转换封装方法
在我们整个项目的编写过程中,我们会经常遇到类型转换,然后我们会不断的重复写is 语句,为了避免重复的代码, 我们这里结合范型封装,写出一个类型转换的静态工具方法。
//Kotlin代码
fun main() {val animal: Animal = Dog()val dog = CastUtil.cast<Dog>(animal)dog?.bark()
}object CastUtil {@JvmStaticfun <T> cast(father: Any): T? = father as? T
}
//输出结果
汪汪...//Java代码
public class Test1 {public static void main(String[] args) {Animal animal=new Dog();Dog dog=CastUtil.cast(animal);dog.bark();}
}
//输出结果
汪汪...