类#isInstance vs Class#isAssignableFrom

时间:2013-10-29 16:30:37

标签: java class instance

给定Class<?> superTypeObject subInstance

之间有什么区别
superType.isInstance(subInstance)

superType.isAssignableFrom(subInstance.getClass())

(如果有的话)?

4 个答案:

答案 0 :(得分:2)

在场景中,没有区别。

两种方法之间的区别在于参数。一个用于对象,一个用于类:

Class#isInstance(Object)

  

确定指定的Object是否与赋值兼容   与此类所代表的对象。

Class#isAssignableFrom(Class)

  

确定由此表示的类或接口   类对象可以是相同的,也可以是超类或   由指定表示的类或接口的超接口   类参数。

答案 1 :(得分:2)

isAssignableFrom还会测试是否可以通过标识转换或扩展引用转换来转换类型。

    Class<?> cInt = Integer.TYPE;

    Long l = new Long(123);

    System.out.println(cInt.isInstance(l)); // false
    System.out.println(cInt.isAssignableFrom(cInt)); // true

答案 2 :(得分:0)

只要类对象表示的类是isAssignableFrom()

的超类或超接口,

subInstance.getClass()就为真 只要对象isInstance()subInstance的实例,

superType就会为真。

所以基本的区别在于isInstance适用于实例isAssignableFrom适用于类。

如果我没有实例/由于某种原因不想实例化类,我经常使用isAssignableFrom。否则你可以同时使用它们。

答案 3 :(得分:0)

来自Java API

isInstance(Object obj)
Determines if the specified Object is assignment-compatible with the object represented by this Class.

isAssignableFrom(Class<?> cls)
Determines if the class or interface represented by this Class object is either the same as, or is a superclass or superinterface of, the class or interface represented by the specified Class parameter.

所以听起来两个方法做的事情非常类似,但是一个人需要Object并查看该对象的Class,而另一个则需要Class。< / p>