当前位置: 代码迷 >> 综合 >> Kotlin-31-is as 对比instanceof
  详细解决方案

Kotlin-31-is as 对比instanceof

热度:106   发布时间:2023-10-09 05:23:13.0

目录

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();}
}
//输出结果
汪汪...