让clazz是某个类,obj是某个对象。

Is

clazz.isAssignableFrom(obj.getClass())

总是一样的

clazz.isInstance(obj)

?

如果不是,有什么不同?


当前回答

这两个答案都差不多,但都不是一个完整的答案。

MyClass.class.isInstance(obj)用于检查实例。当参数obj非空并且可以强制转换为MyClass而不引发ClassCastException时,它返回true。换句话说,obj是MyClass或其子类的实例。

MyClass.class. isassignablefrom (Other.class)如果MyClass与Other相同,或者是Other的超类或超接口,则返回true。Other可以是类或接口。如果Other可以转换为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
    }
}

其他回答

为简洁起见,我们可以像下面这样理解这两个api:

X.class.isAssignableFrom (Y.class)

如果X和Y是同一个类,或者X是Y的超类或超接口,则返回true,否则返回false。

X.class.isInstance (y)

假设y是类y的实例,如果X和y是同一个类,或者X是y的超类或超接口,则返回true,否则返回false。

我认为这两者的结果应该是一样的。区别在于使用isInstance需要类的实例,而使用isAssignableFrom只需要class对象。

这两个答案都差不多,但都不是一个完整的答案。

MyClass.class.isInstance(obj)用于检查实例。当参数obj非空并且可以强制转换为MyClass而不引发ClassCastException时,它返回true。换句话说,obj是MyClass或其子类的实例。

MyClass.class. isassignablefrom (Other.class)如果MyClass与Other相同,或者是Other的超类或超接口,则返回true。Other可以是类或接口。如果Other可以转换为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
    }
}

当clazz对象表示的类是Foo的超类或超接口时,clazz. isassignablefrom (Foo.class)将为真。

当对象obj是类clazz的实例时,clazz. isinstance (obj)将为true。

那就是:

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

只要claz和obj为非空,则始终为真。