【问题标题】:Check if an object belongs to a class in Java [duplicate]检查对象是否属于Java中的类[重复]
【发布时间】:2011-05-16 17:48:32
【问题描述】:

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

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

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

【问题讨论】:

    标签: java polymorphism


    【解决方案1】:

    instanceof 关键字,如其他答案所述,通常是您想要的。 请记住,instanceof 也会为超类返回 true

    如果你想查看一个对象是否是一个类的直接实例,你可以比较这个类。您可以通过getClass() 获取实例的类对象。您可以通过ClassName.class 静态访问特定的类。

    例如:

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

    在上面的示例中,如果aX 的实例,则条件为真,但如果aX 的子类的实例,则条件不成立。

    相比之下:

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

    instanceof 示例中,如果aX 的实例,或者aX子类 的实例,则条件为真。

    大多数时候,instanceof 是对的。

    【讨论】:

      【解决方案2】:

      如果您需要动态执行此操作,可以使用以下方法:

      boolean isInstance(Object object, Class<?> type) {
          return type.isInstance(object);
      }
      

      您可以通过在任何对象上调用实例方法Object::getClass 来获取java.lang.Class 的实例(返回该对象是其实例的Class),或者您可以使用类文字(例如,@987654326 @、List.classint[].class)。还有其他方法,通过反射 API(Class 本身就是入口点)。

      【讨论】:

      • 或者更好的是,使用 IsAssignableFrom(Class)
      • @Chii 但是你需要再次在a 上调用getClass,这是反手试图避免的。
      • 否 - 您只需要引用您想要比较的类 - a.getClass().isAssignableFrom(MyClass.class) ,或者相反。
      • @Chii 假设他提前知道要与哪个班级进行比较。我的答案是动态地做。
      • 这对继承的对象也有效吗?就像如果类Sub 派生自Super 并且在一个方法中,签名是method(Super super) 那么如果我评估super isinstanceof Sub,如果Sub 类型的对象作为参数传递给这个方法,它会起作用吗?
      【解决方案3】:

      使用instanceof 运算符:

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

      【讨论】:

        【解决方案4】:

        我同意使用已经提到的instanceof

        使用instanceof 的另一个好处是,当与null 引用一起使用时,instanceof 将返回false,而a.getClass() 将抛出NullPointerException

        【讨论】:

          【解决方案5】:

          试试运营商instanceof

          【讨论】:

            【解决方案6】:

            通常的方法是:

            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) {
                     ...
                }
            }
            

            您不能在运行时强制转换为 A,因为在运行时,A 本质上是 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);
            

            【讨论】:

              猜你喜欢
              • 2013-01-30
              • 2020-06-15
              • 1970-01-01
              • 1970-01-01
              • 2023-04-09
              • 2018-01-01
              • 2013-12-26
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多