本文已同步发表于我的微信公众号,搜索 代码说 即可关注,欢迎与我沟通交流。
文章目录
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)
注意:如果 cls
为 null
的话,会抛出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
中,instanceof
和isAssignableFrom
的用法与Java
略有不同。
is
is
关键字表示,用于检查一个对象是否是指定类或其子类的实例。instanceof
在 Kotlin
中使用 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
在上面的示例中,animal
是Animal
类的实例,因此animal is Animal
返回true
。dog
是Dog
类的实例,也是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()
isAssignableFrom
在 Kotlin
中使用 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
类的变量。