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