【问题标题】:Is there something like instanceOf(Class<?> c) in Java?Java中有类似instanceOf(Class<?> c)的东西吗?
【发布时间】:2010-10-31 06:21:43
【问题描述】:

我想检查一个对象oC 类的实例还是C 的子类。

例如,如果 p 属于 Point 类,我希望 x.instanceOf(Point.class) 成为 true 并且还希望 x.instanceOf(Object.class) 成为 true

我希望它也适用于盒装原始类型。例如,如果xInteger,那么x.instanceOf(Integer.class) 应该是true

有这种事吗?如果没有,我该如何实现这样的方法?

【问题讨论】:

  • 处理盒装类有点乱

标签: java reflection instanceof


【解决方案1】:

Class.isInstance 做你想做的事。

if (Point.class.isInstance(someObj)){
    ...
}

当然,如果可以使用instanceof,则不应该使用它,但对于反射场景,它通常会派上用场。

【讨论】:

  • @Ahamed 它可能更慢,但更糟糕的是它更难理解!如果有一种非常简单的方法来做某事——比如if (a instanceof Point)——但是你用一种更复杂的方式来做,那么阅读代码的人一定会想“哦,必须有一个理由让这件事变得艰难",然后跳转到文档以了解 Class.isInstanceinstanceof 的不同之处。你浪费了同事的时间。
【解决方案2】:

我想检查一个对象 o 是否是 类 c 或 a 的实例 c的子类。例如,如果 p 是 我想要的班级点数 x.instanceOf(Point.class)

嗯...什么? o、p、x是什么?

我希望它也适用于原始 类型。例如,如果 x 是 那么整数 x.instanceOf(Integer.class) 以及 x.instanceOf(Object.class) 应该是 真的。

没有。它甚至不应该编译。基元不是对象,您不能对它们调用方法。

无论如何,有三件事,其中一件绝对可以达到你想要的(它们在具体应用的地方有些不同:

  • instanceof 运算符,如果您在编译时知道该类。
  • Class.isInstance() 如果您想检查对象的类与编译时未知的类。
  • Class.isAssignableFrom() 如果您想检查给定两个类对象的可分配性。

【讨论】:

    【解决方案3】:
    x instanceof Integer
    x instanceof Object
    

    你只需要使用正确的语法

    对于原始类型,您必须完全不同。由于您无法为它们创建方法,因此您需要一个保留该方法的类。因此,您必须调用“MyClassComparer.instanceOf(x, Integer.Class)”或类似名称,而不是“x.instanceOf(Integer.Class)”。这可以很容易地通过重载方法来实现,但我看不到这种功能完全需要的情况。

    【讨论】:

      【解决方案4】:

      事实上,在 Java 中有一个名为 instanceof 的布尔运算符,可用于确定对象是类的实例、子类的实例还是实现特定接口的类的实例。

      if(obj instanceof SomeClass) {
          // Do something
      }
      

      Java 教程中有一个good example 这个运算符

      【讨论】:

      • 您不能将 instanceof 与原始类型一起使用
      • 他将原始类型与对象混淆了。请阅读...“例如,如果 x 是整数,则 x.instanceOf(Integer.class) 和 x.instanceOf(Object.class) 也应该为真。”对所有答案都投反对票感到羞耻
      • 第二个(sp)使用Java教程的建议。它是学习语言本身的一个很好的参考。
      【解决方案5】:

      Class.isAssignableFrom() 的右侧是子类

      所以,对于对象obj 和超类Class&lt;?&gt; superCls

      superCls.isAssignableFrom( obj.getClass() )

      obj instanceof superCls

      是等价的。

      【讨论】:

        【解决方案6】:

        你可以这样做:

        if (foo instanceof classNameYouWantToCheck) 
        

        【讨论】:

        • 您不能将 instanceof 与原始类型一起使用
        • 上课只是为了表明他应该在那里写下课程名称。我会解决的
        【解决方案7】:

        “我希望它也适用于原始类型。例如,如果 x 是整数,则 x.instanceOf(Integer.class) 和 x.instanceOf(Object.class) 也应该为真。”

        为什么?原始类型和引用类型是完全分开的。原始 int 不是 Integer 或 Object 的子类型。原始值的类型在编译时始终是静态已知的,因此测试其类型毫无意义。当然,您可以将原始值装箱,然后测试其类型:

        (Integer)5 instanceof Integer
        

        但重点是什么?

        【讨论】:

          【解决方案8】:

          我认为您对原始对象和通用对象的 instanceof 感到困惑

          obj instanceof Class
          obj instanceof Class<?> // this is the one you want
          

          【讨论】:

          • 由于类型擦除,您不能在 instanceof 运算符的右侧使用泛型。
          • 不,是对此感到困惑。你必须在instanceof之后使用原始类型。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-24
          • 2010-11-18
          • 2015-11-03
          • 2011-12-29
          • 1970-01-01
          • 2015-12-14
          • 1970-01-01
          相关资源
          最近更新 更多