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