代码之家  ›  专栏  ›  技术社区  ›  chimeracoder

检查对象是否属于Java中的类[duplicate]

  •  62
  • chimeracoder  · 技术社区  · 15 年前

    这个问题已经有了答案:

    有没有一种简单的方法来验证对象是否属于给定的类?例如,我可以

    if(a.getClass() = (new MyClass()).getClass())
    {
        //do something
    }
    

    但这需要每次都动态地实例化一个新对象,只需丢弃它。有没有更好的方法来检查“a”是否属于“MyClass”类?

    6 回复  |  直到 15 年前
        1
  •  157
  •   evandrix    9 年前

    这个 instanceof 正如其他答案所描述的,关键字通常是您想要的。 记住 运算符 会回来的 true 对于超类也是如此。

    如果要查看对象是否是类的直接实例,可以比较该类。您可以通过 getClass() . 您可以通过 ClassName.class .

    例如:

    if (a.getClass() == X.class) {
      // do something
    }
    

    在上面的例子中,如果 a X ,但如果 .

    相比之下:

    if (a instanceof X) {
        // do something
      }
    

    运算符 例如,如果 ,或者如果 子类 属于 .

    大多数时候, 运算符 是对的。

        2
  •  21
  •   gdejohn    11 年前

    如果需要动态执行此操作,可以使用以下命令,

    if (clazz.isInstance(a)) {
          // do something
    }
    

    哪里 clazz Class .

        3
  •  16
  •   Jacob Relkin    15 年前

    使用 instanceof 操作员:

    if(a instanceof MyClass)
    {
        //do something
    }
    
        4
  •  4
  •   Kos    15 年前

    Try运算符 instanceof .

        5
  •  4
  •   Justin Muller    15 年前

    我同意使用 instanceof 已经提到了。

    使用的额外好处 运算符 是不是和 null 参考 运算符 意志的回归 false ,而 a.getClass() 会抛出一个 NullPointerException .

        6
  •  2
  •   Martin Konicek Phil Windley    13 年前

    通常的方法是:

    if (a instanceof A)
    

    但是,有些情况下您不能这样做,例如 A 在一个普通的论点中。

    由于Java的类型擦除,以下代码无法编译:

    <A> boolean someMethod(Object a) {
        if (a instanceof A)
        ...
    }
    

    下面的方法不起作用 unchecked cast 警告):

    <A> void someMethod(Object a) {
        try {
            A casted = (A)a;    
        } catch (ClassCastException e) {
             ...
        }
    }
    

    你不能投球 一个 在运行时,因为在运行时, 一个 本质上 Object .

    解决这种情况的方法是使用 Class 而不是泛型参数:

    void someMethod(Object a, Class<A> aClass) {
        if (aClass.isInstance(a)) {
           A casted = aClass.cast(a);
           ...
        }
    }
    

    然后可以将该方法调用为:

    someMethod(myInstance, MyClass.class);
    someMethod(myInstance, OtherClass.class);