您的位置:

IsAssignableFrom instanceof:两种Java类型比较的差异与联系

一、基本介绍

Java中有两种常用的类型比较方法:isAssignableFrom与instanceof,它们都可以用来判断一个Java对象是否是一个类或接口的实例。它们的共同点是都可以进行类型比较,但是它们的使用场景和一些区别也需要我们认真了解。

二、isAssignableFrom的使用

isAssignableFrom是Class类中的方法。isAssignableFrom方法的作用是判定是否为某个类的父类,即判断是否可以从参数类型转换到调用方法的类的类型。

    public boolean isAssignableFrom(Class cls)

例如:

    Object obj = new String();
    Class clz = String.class;
    boolean bool1 = clz.isAssignableFrom(obj.getClass());     //true
    boolean bool2 = obj.getClass().isAssignableFrom(clz);     //false

在这个例子中,我们可以看到Class String和Object之间的继承关系。由于String是Object的子类,所以String可以赋值给Object类型的变量。这也是为什么bool1返回true的原因。

bool2是false的原因是因为String不能被赋值给Class Object。String是Class String的一个实例,而Class Object是Class String的父类,所以bool2是false。

三、instanceof的使用

instanceof是java关键字,它用来判断一个对象是否是一个类的实例,或者是该类及其子类的实例。

    Object obj = new String();
    boolean bool1 = obj instanceof String;    //true
    boolean bool2 = obj instanceof Object;    //true
    boolean bool3 = obj instanceof Integer;   //false

在这个例子中,我们可以看到obj是一个String的实例,所以bool1是true。由于String是Object的子类,而obj是String和Object的共同祖先Object的子类,所以bool2是true。由于obj不是一个Integer类型,所以bool3是false。

四、isAssignableFrom和instanceof的区别

虽然isAssignableFrom和instanceof都可以用来进行类型比较,但是它们的使用场景和实现方式是不同的。

1. 使用场景:

isAssignableFrom一般用来进行类型转换,判断一个类型是否可以转换成另外一个类型。

    Class clazz = String.class;
    Object obj = clazz.newInstance();
    if(clazz.isAssignableFrom(obj.getClass())){
        String str = (String)obj;      //转换成功
    }

而instanceof一般用来判断一个类的实例是否为另外一个类或者接口的实例。

    Object obj = new String();
    if(obj instanceof String){
        String str = (String)obj;      //类型判断通过
    }

2. 原理实现:

isAssignableFrom的实现方式:判断调用方是否是参数的父类或者实现的接口。

    public boolean isAssignableFrom(Class cls) {
        return (cls != null) && (cls.isSubclassOf(this) || this == cls);
    }

instanceof的实现方式:使用Java虚拟机中的checkcast指令。

    Object obj = new String();
    if(obj instanceof String){
        String str = (String)obj;
    }
    //上面的代码大致相当于
    String str = (String)obj;
    //Java虚拟机在执行这行代码时会执行类似于下面这样的指令
    if(!obj.getClass().isInstance(str)){
        throw new ClassCastException();
    }

五、总结

虽然isAssignableFrom和instanceof都是用于Java类型比较的,但是它们是有区别的。isAssignableFrom主要用于判断一个类是否是另外一个类或者接口的父类,而instanceof主要用于判断一个对象是否为一个类或者其子类的实例。需要根据具体情况选择合适的类型比较方法。