【问题标题】:Class#isInstance vs Class#isAssignableFrom [duplicate]Class#isInstance vs Class#isAssignableFrom [重复]
【发布时间】:2013-11-08 22:47:34
【问题描述】:

给定一个Class<?> superType 和一个Object subInstance,它们之间有什么区别

superType.isInstance(subInstance)

superType.isAssignableFrom(subInstance.getClass())

(如果有的话)?

【问题讨论】:

  • 查看java源代码
  • @Sunny 两种方法都是原生的。
  • 哎呀!没想到
  • 或许你可以看看this

标签: java class instance


【解决方案1】:

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

    Class<?> cInt = Integer.TYPE;

    Long l = new Long(123);

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

【讨论】:

  • 示例代码似乎没有证明什么——cInt.isAssignableFrom(cInt) 当然是正确的,因为它正在测试自己。这不是与cInt.isInstance(l) 的比较,因为l 是Long,而不是Integer.TYPE
【解决方案2】:

来自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

【讨论】:

    【解决方案3】:

    在场景中,没有区别。

    这两种方法的区别在于参数。一种适用于对象,一种适用于类:

    Class#isInstance(Object)

    确定指定的对象是否与赋值兼容 用这个类表示的对象。

    Class#isAssignableFrom(Class)

    确定 this 表示的类或接口是否 类对象要么相同,要么是超类,要么 指定的类或接口的超接口 类参数。

    【讨论】:

      【解决方案4】:

      只要类对象表示的类是subInstance.getClass()的超类或超接口,isAssignableFrom()就会为真

      只要对象subInstancesuperType 的实例,isInstance() 就会为真。

      所以基本区别在于 isInstance 与实例一起使用 isAssignableFrom 与类一起使用。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-08
        • 1970-01-01
        • 1970-01-01
        • 2016-10-05
        • 2018-05-27
        • 1970-01-01
        • 1970-01-01
        • 2011-11-30
        相关资源
        最近更新 更多