java:Class.isInstance与Class.isAssignableFrom
让clazz是一些Class和obj是一些Object 。
是
clazz.isAssignableFrom(obj.getClass())
总是一样的
clazz.isInstance(obj)
?
如果不是,有什么区别?
当clazz对象表示的类是Foo的超类或超接口时, clazz.isAssignableFrom(Foo.class)将为true。
只要对象obj是类clazz一个实例, clazz.isInstance(obj)就是true。
那是:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
总是如此。
两个答案都是在场上,但都不是一个完整的答案。
MyClass.class.isInstance(obj)用于检查一个实例。 当参数obj非空时它返回true,并且可以在不引发ClassCastException情况下ClassCastException为MyClass 。 换句话说,obj是MyClass或其子类的一个实例。
MyClass.class.isAssignableFrom(Other.class)将返回true,如果MyClass是相同的,或者是Other的超类或超级接口。 Other可以是一个类或一个接口。 如果“ Other可以转换为“ MyClass则返回true。
一个小小的代码来演示:
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
我认为这两个结果应该是一样的。 区别在于您需要使用isInstance的类的实例,而只需要使用isAssignableFrom的Class对象。
为了简洁,我们可以理解这两个API如下:
- X.class.isAssignableFrom(Y.class)
如果X和Y是相同的类,或者X是Y的超类或超级接口,则返回true,否则返回false。
- X.class.isInstance(Y):
说y是类Y的一个实例,如果X和Y是相同的类,或者X是Y的超类或超级接口,则返回true,否则返回false。