java:Class.isInstance vs Class.isAssignableFrom

时间:2010-10-16 14:24:13

标签: java

clazzClassobjObject

clazz.isAssignableFrom(obj.getClass())

始终与

相同
clazz.isInstance(obj)

如果没有,有什么区别?

4 个答案:

答案 0 :(得分:197)

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

Foo就为真。

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

clazz就会为真。

那是:

clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
只要clazzobj是非空的,

始终为真。

答案 1 :(得分:182)

这两个答案都在争议中,但两者都不是一个完整的答案。

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

如果MyClass.class.isAssignableFrom(Other.class)MyClass的超级类或超级接口相同,则

Other将返回true。 Other可以是类或接口。如果Other可以转换为MyClass,则回答为真。

要演示的一些代码:

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

    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));
        System.out.println("b isInstance a: " + A.class.isInstance(myB));
        System.out.println("a isInstance b: " + B.class.isInstance(myA));
        System.out.println("b isAssignableFrom a: " + A.class.isAssignableFrom(B.class));
        System.out.println("a isAssignableFrom b: " + B.class.isAssignableFrom(A.class));
        System.out.println("bArr isInstance A: " + A.class.isInstance(bArr));
        System.out.println("bArr isInstance aArr: " + aArr.getClass().isInstance(bArr));
        System.out.println("bArr isAssignableFrom aArr: " + aArr.getClass().isAssignableFrom(bArr.getClass()));
    }

    class A
    {
    }

    class B extends A
    {
    }
}

输出:

b instanceof a: true
b isInstance a: true
a isInstance b: false
b isAssignableFrom a: true
a isAssignableFrom b: false
bArr isInstance A: false
bArr isInstance aArr: true
bArr isAssignableFrom aArr: true

答案 2 :(得分:5)

我认为这两者的结果应该始终相同。不同之处在于,您需要使用isInstance类的实例,而只需要Class对象才能使用isAssignableFrom

答案 3 :(得分:5)

为简洁起见,我们可以理解以下两个API:

  1. X.class.isAssignableFrom(Y.class)
  2. 如果XY是同一个类,或XY的超类或超级接口,则返回true,否则返回false。

    1. X.class.isInstance(y)
    2. y是类Y的实例,如果XY是同一个类,或者XY& #39;超级类或超级接口,返回true,否则返回false。