让clazz一些Class和obj一些Object.
是
clazz.isAssignableFrom(obj.getClass())
Run Code Online (Sandbox Code Playgroud)
总是一样的
clazz.isInstance(obj)
Run Code Online (Sandbox Code Playgroud)
?
如果没有,有什么区别?
uck*_*man 209
clazz.isAssignableFrom(Foo.class)只要clazz对象表示的类是超类或超级接口,它就是真的Foo.
clazz.isInstance(obj)只要对象obj是类的实例,它就会为true clazz.
那是:
clazz.isAssignableFrom(obj.getClass()) == clazz.isInstance(obj)
Run Code Online (Sandbox Code Playgroud)
只要clazz并且obj是非空的,它总是正确的.
Pau*_*aul 189
这两个答案都在球场上,但两者都不是一个完整的答案.
MyClass.class.isInstance(obj)用于检查实例.当参数obj为非null时它返回true,并且可以在MyClass不引发a的情况下强制转换为ClassCastException.换句话说,obj是MyClass或其子类的实例.
MyClass.class.isAssignableFrom(Other.class)如果MyClass与,或者是超类或超级接口相同,则返回true Other. Other可以是类或接口.如果Other可以转换为a ,则回答为true MyClass.
一个小代码来演示:
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
{
}
}
Run Code Online (Sandbox Code Playgroud)
并输出:
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
Run Code Online (Sandbox Code Playgroud)
我认为这两个的结果应该总是相同的。区别在于您需要使用该类的实例,isInstance而仅Class需要使用该对象isAssignableFrom。
小智 6
为简洁起见,我们可以理解以下两个API:
X.class.isAssignableFrom(Y.class)如果X和Y是同一类的,或者X是Y"超级类或超接口,返回true,否则为false.
X.class.isInstance(y)Say y是类的实例Y,if X和Y是同一个类,或者X是Y超类或超级接口,返回true,否则返回false.