【Java基础】-- isAssignableFrom 的用法详细解析
最近在java的源代码中总是可以看到 isAssignableFrom()
这个方法,到底是干嘛的?怎么用?
一、简介
首先我们必须知道的是,java 里面一切皆对象,类本身也是会当成对象来处理,主要体现在类的 .class
文件,其实加载到 java 虚拟机之后,也是一个对象,它就是 Class
对象,全限定类名: java.lang.Class
。
那这个 isAssignableFrom()
其实就是 Class 对象的一个方法:
/**
* Determines if the class or interface represented by this
* {@code Class} object is either the same as, or is a superclass or
* superinterface of, the class or interface represented by the specified
* {@code Class} parameter. It returns {@code true} if so;
* otherwise it returns {@code false}. If this {@code Class}
* object represents a primitive type, this method returns
* {@code true} if the specified {@code Class} parameter is
* exactly this {@code Class} object; otherwise it returns
* {@code false}.
*
* <p> Specifically, this method tests whether the type represented by the
* specified {@code Class} parameter can be converted to the type
* represented by this {@code Class} object via an identity conversion
* or via a widening reference conversion. See <em>The Java Language
* Specification</em>, sections 5.1.1 and 5.1.4 , for details.
*
* @param cls the {@code Class} object to be checked
* @return the {@code boolean} value indicating whether objects of the
* type {@code cls} can be assigned to objects of this class
* @exception NullPointerException if the specified Class parameter is
* null.
* @since JDK1.1
*/
public native boolean isAssignableFrom(Class<?> cls);
用 native
关键字描述,说明是一个底层方法,实际上是使用 c/c++ 实现的,java 里面没有实现,那么这个方法是干什么的呢?我们从上面的注释可以解读:
就是判断当前的Class对象所表示的类,是不是参数中传递的Class对象所表示的类的父类,超接口,或者是相同的类型。是则返回true,否则返回false。
二、代码演示
class A{
}
class B extends A{
}
class C extends B{
}
public class test {
public static void main(String[] args) {
A a = new A();
B b = new B();
B b1 = new B();
C c = new C();
System.out.println(a.getClass().isAssignableFrom(a.getClass()));
System.out.println(a.getClass().isAssignableFrom(b.getClass()));
System.out.println(a.getClass().isAssignableFrom(c.getClass()));
System.out.println(b1.getClass().isAssignableFrom(b.getClass()));
System.out.println(b.getClass().isAssignableFrom(c.getClass()));
System.out.println("=====================================");
System.out.println(A.class.isAssignableFrom(a.getClass()));
System.out.println(A.class.isAssignableFrom(b.getClass()));
System.out.println(A.class.isAssignableFrom(c.getClass()));
System.out.println("=====================================");
System.out.println(Object.class.isAssignableFrom(a.getClass()));
System.out.println(Object.class.isAssignableFrom(String.class));
System.out.println(String.class.isAssignableFrom(Object.class));
}
}
运行结果如下:
true
true
true
true
true
=====================================
true
true
true
=====================================
true
true
false
三、总结
isAssignableFrom
是用来判断子类和父类的关系的,或者接口的实现类和接口的关系的,默认所有的类的终极父类都是 Object
。如果 A.isAssignableFrom(B)
结果是true,证明 B
类型可以转换成为 A
类型,因为 A 类型是 B 类型的超类(接口)或者本身。
原文地址:https://zhuanlan.zhihu.com/p/317784108