java:Class.isInstance与Class.isAssignableFrom

clazz是一些Classobj是一些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情况下ClassCastExceptionMyClass 。 换句话说,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的类的实例,而只需要使用isAssignableFromClass对象。

为了简洁,我们可以理解这两个API如下:

  1. X.class.isAssignableFrom(Y.class)

如果X和Y是相同的类,或者X是Y的超类或超级接口,则返回true,否则返回false。

  1. X.class.isInstance(Y):

说y是类Y的一个实例,如果X和Y是相同的类,或者X是Y的超类或超级接口,则返回true,否则返回false。