Java基础-- isAssignableFrom 的用法详细解析
Posted 戴泽supp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础-- isAssignableFrom 的用法详细解析相关的知识,希望对你有一定的参考价值。
【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
以上是关于Java基础-- isAssignableFrom 的用法详细解析的主要内容,如果未能解决你的问题,请参考以下文章
Java isAssignableFrom()方法与instanceof()方法区别
Java isAssignableFrom()方法与instanceof()方法区别