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()方法区别

Java isAssignableFrom()方法与instanceof()方法区别

Java中isAssignableFrom的用法

instanceof 与isAssignableFrom

Class对象的isAssignableFrom方法