让clazz一些Class和obj一些Object。
是
clazz.isAssignableFrom(obj.getClass())
总是和
clazz.isInstance(obj)
?
如果没有,有什么区别?
clazz.isAssignableFrom(Foo.class)只要该clazz对象表示的类是的超类或超接口,它就为true Foo。
clazz.isAssignableFrom(Foo.class)
clazz
true Foo
clazz.isInstance(obj)只要对象obj是类的实例,它将为true clazz。
obj
true clazz
那是:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
只要clazz并且obj为非null,就始终为真。
null
这两个答案都在球场上,但都不是完整答案。
MyClass.class.isInstance(obj)用于检查实例。当参数obj为非null且可以在MyClass不引发a的情况下进行强制转换时,它返回true ClassCastException。换句话说,obj是MyClass或其子类的实例。
MyClass.class.isInstance(obj)
true ClassCastException
MyClass
MyClass.class.isAssignableFrom(Other.class)如果MyClass与相同,或者是的超类或超接口,则将返回true Other。 Other可以是类或接口。如果Other可以转换为,则答案为true MyClass。
MyClass.class.isAssignableFrom(Other.class)
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 } }