Java & Kotlin 类型检查之instanceof、isAssignableFrom() 与is 、 isSubclassOf()

本文已同步发表于我的微信公众号,搜索 代码说 即可关注,欢迎与我沟通交流。

Java之instanceof & isAssignableFrom()

instanceof

instanceof 操作符用于检测一个对象是否是指定类或其子类的实例

使用举例:

public interface Run{} //interface

class Parent implements Run{} //Parent

class Child extends Parent {} //Child

public static void main(String[] args) {
  //类型比较
  Parent p = new Parent();
  Child c = new Child();
  Parent p1 = new Child();

  System.out.println(p instanceof Parent); //true
  System.out.println(c instanceof Child); //true
  System.out.println(p1 instanceof Child);//true
  System.out.println(p1 instanceof Parent);//true

  //null值返回false
  Parent p2 = null;
  System.out.println(p2 instanceof Parent); //false
}

  //interface
  Run run = new Parent();
  System.out.println(run instanceof Parent);//true
  System.out.println(run instanceof Child);//false

注意:如果对任何具有空值的变量应用 instanceof 操作符,它将直接返回 false

isAssignableFrom()

isAssignableFrom()Java.lang.Class下的方法,用于判断当前 Class 是否与指定 Class 参数表示的类(或接口)相同,或者是它们的超类(或超接口),注意这里是两个类的比较

public boolean isAssignableFrom(Class<?> cls)

注意:如果 clsnull 的话,会抛出java.lang.NullPointerException异常。

使用举例:

//Parent
class Parent implements Run{}

//Child
class Child extends Parent {}

public static void main(String[] args) {
    Parent p = new Parent();
    Child c = new Child();
    System.out.println(Parent.class.isAssignableFrom(p.getClass()));//true
    System.out.println(Child.class.isAssignableFrom(c.getClass()));//true
    System.out.println(Parent.class.isAssignableFrom(c.getClass()));//true
    System.out.println(Child.class.isAssignableFrom(p.getClass()));//false
 }
}

Kotlin之 is & isSubclassOf()

Kotlin中,instanceofisAssignableFrom 的用法与Java 略有不同。

is

is 关键字表示,用于检查一个对象是否是指定类或其子类的实例。instanceofKotlin 中使用 is 关键字表示,用于检查一个对象是否是指定类或其子类的实例。例如:

open class Animal
class Dog : Animal()

val animal: Animal = Animal()
val dog: Animal = Dog()

println(animal is Animal) // true
println(dog is Animal) // true
println(animal is Dog) // false
println(dog is Dog) // true

在上面的示例中,animalAnimal类的实例,因此animal is Animal返回truedogDog类的实例,也是Animal类的子类,因此dog is Animal返回true,而dog is Dog也返回true

is 在类型检查通过之后,会自动将其转换为对应的类型,如:

open class Animal(val name: String)

class Dog(name: String) : Animal(name) {
    fun bark() {
        println("$name is barking")
    }
   }

fun printAnimalName(animal: Animal) {
    if (animal is Dog) {
        // 如果animal是Dog类的实例,则将其转换为Dog类型,并调用bark()方法
        animal.bark()
    }
}

上述 if (animal is Dog)判断成功之后,{}中会直接将其转换为Dog类,而不用再像Java那样进行强转;如果就需要进行转换,则可以使用as? 操作符,示例:判断当前context 是否是Activity,如果是,继续判断当前页面是否关闭,上述操作可以直接使用(context as? Activity)?.isFinishing == false 进行判断,即使context 不是Activity(context as? Activity) 会直接返回null,进而整体判断返回false(不会因为类型转换失败而崩溃),而Java中的强转(Activity)context这种有可能会因为类型转换失败而直接抛异常。

isSubclassOf()

isAssignableFromKotlin 中使用 isSubclassOf() 方法表示,用于检查一个类是否可以赋值给另一个类。例如:

open class Animal
class Dog : Animal()

println(Dog::class.isSubclassOf(Animal::class)) // true
println(Animal::class.isSubclassOf(Dog::class)) // false

在上面的示例中,Dog::class.isSubclassOf(Animal::class) 返回 true,因为 Dog 类是Animal 类的子类,所以Dog类的实例可以赋值给Animal类的变量。相反,Animal::class.isSubclassOf(Dog::class) 返回 false,因为Animal类不是Dog类的子类,所以Animal类的实例不能赋值给Dog类的变量。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_小马快跑_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值