快捷搜索: 王者荣耀 脱发

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();
    }
}
//输出结果
汪汪...
经验分享 程序员 微信小程序 职场和发展