小编典典

java:Class.isInstance与Class.isAssignableFrom

java

让clazz一些Class和obj一些Object。

clazz.isAssignableFrom(obj.getClass())

总是和

clazz.isInstance(obj)

如果没有,有什么区别?


阅读 472

收藏
2020-03-21

共2个答案

小编典典

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

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

那是:

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

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

2020-03-21
小编典典

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

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
    }
}
2020-03-21