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。