您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

java:Class.isInstance与Class.isAssignableFrom

java:Class.isInstance与Class.isAssignableFrom

clazz.isAssignableFrom(Foo.class)只要该clazz对象表示的类是的超类或超接口,它就为true Foo

clazz.isinstance(obj)只要对象obj是类的实例,它将为true clazz

那是:

clazz.isAssignableFrom(obj.getClass()) == clazz.isinstance(obj)

只要clazz并且obj为非null,就始终为真。

这两个答案都在球场上,但都不是完整答案。

MyClass.class.isinstance(obj)用于检查实例。当参数obj为非null且可以在MyClass不引发a的情况下进行强制转换时,它返回true ClassCastException。换句话说,obj是MyClass或其子类的实例。

MyClass.class.isAssignableFrom(Other.class)如果MyClass与相同,或者是的超类或超接口,则将返回true OtherOther可以是类或接口。如果Other可以转换为,则答案为true MyClass

一些代码来演示:

public class NewMain
{
    public static void main(String[] args)
    {
        NewMain nm = new NewMain();
        nm.doit();
    }

    class A { }

    class B extends A { }

    public void doit()
    {
        A myA = new A();
        B myB = new B();
        A[] aArr = new A[0];
        B[] bArr = new B[0];

        System.out.println("b instanceof a: " + (myB instanceof A)); // true
        System.out.println("b isinstance a: " + A.class.isinstance(myB)); //true
        System.out.println("a isinstance b: " + B.class.isinstance(myA)); //false
        System.out.println("b isAssignableFrom a: " + A.class.isAssignableFrom(B.class)); //true
        System.out.println("a isAssignableFrom b: " + B.class.isAssignableFrom(A.class)); //false
        System.out.println("bArr isinstance A: " + A.class.isinstance(bArr)); //false
        System.out.println("bArr isinstance aArr: " + aArr.getClass().isinstance(bArr)); //true
        System.out.println("bArr isAssignableFrom aArr: " + aArr.getClass().isAssignableFrom(bArr.getClass())); //true
    }
}
java 2022/1/1 18:17:33 有576人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶