让clazz是某个类,obj是某个对象。
Is
clazz.isAssignableFrom(obj.getClass())
总是一样的
clazz.isInstance(obj)
?
如果不是,有什么不同?
让clazz是某个类,obj是某个对象。
Is
clazz.isAssignableFrom(obj.getClass())
总是一样的
clazz.isInstance(obj)
?
如果不是,有什么不同?
当前回答
当clazz对象表示的类是Foo的超类或超接口时,clazz. isassignablefrom (Foo.class)将为真。
当对象obj是类clazz的实例时,clazz. isinstance (obj)将为true。
那就是:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
只要claz和obj为非空,则始终为真。
其他回答
这两个答案都差不多,但都不是一个完整的答案。
MyClass.class.isInstance(obj)用于检查实例。当参数obj非空并且可以强制转换为MyClass而不引发ClassCastException时,它返回true。换句话说,obj是MyClass或其子类的实例。
MyClass.class. isassignablefrom (Other.class)如果MyClass与Other相同,或者是Other的超类或超接口,则返回true。Other可以是类或接口。如果Other可以转换为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
}
}
我认为这两者的结果应该是一样的。区别在于使用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。
当clazz对象表示的类是Foo的超类或超接口时,clazz. isassignablefrom (Foo.class)将为真。
当对象obj是类clazz的实例时,clazz. isinstance (obj)将为true。
那就是:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
只要claz和obj为非空,则始终为真。