Kotlin-31-is as 对比instanceof
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 method public 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 Dog dog.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? Dog dog?.bark() }
5、类型转换封装方法
在我们整个项目的编写过程中,我们会经常遇到类型转换,然后我们会不断的重复写is 语句,为了避免重复的代码, 我们这里结合范型封装,写出一个类型转换的静态工具方法。
//Kotlin代码 fun main() { val animal: Animal = Dog() val dog = CastUtil.cast<Dog>(animal) dog?.bark() } object CastUtil { @JvmStatic fun <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(); } } //输出结果 汪汪...