让clazz
为Class
,obj
为Object
。
时
clazz.isAssignableFrom(obj.getClass())
始终与
相同clazz.isInstance(obj)
如果没有,有什么区别?
答案 0 :(得分:197)
clazz.isAssignableFrom(Foo.class)
对象表示的类是clazz
的超类或超接口, Foo
就为真。
clazz.isInstance(obj)
是类obj
的实例, clazz
就会为真。
那是:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
只要clazz
和obj
是非空的,始终为真。
答案 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:
X.class.isAssignableFrom(Y.class)
如果X
和Y
是同一个类,或X
是Y
的超类或超级接口,则返回true,否则返回false。
X.class.isInstance(y)
说y
是类Y
的实例,如果X
和Y
是同一个类,或者X
是Y
& #39;超级类或超级接口,返回true,否则返回false。