Подтвердить что ты не робот

Проверьте, принадлежит ли объект классу в Java

Есть ли простой способ проверить, принадлежит ли объект данному классу? Например, я мог бы сделать

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

но для этого требуется каждый раз создавать новый объект "на лету", только чтобы отбросить его. Есть ли лучший способ проверить, что "a" принадлежит классу "MyClass"?

4b9b3361

Ответ 1

Ключевое слово instanceof, как описано в других ответах, обычно то, что вы хотели бы. Имейте в виду, что instanceof вернет true для суперклассов.

Если вы хотите увидеть, является ли объект прямым экземпляром класса, вы можете сравнить класс. Вы можете получить объект класса экземпляра через getClass(). И вы можете статически получить доступ к определенному классу через ClassName.class.

Итак, например:

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

В приведенном выше примере условие истинно, если a является экземпляром X, но не если a является экземпляром подкласса X.

В сравнении:

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

В примере instanceof условие истинно, если a является экземпляром X, или если a является экземпляром подкласса X.

В большинстве случаев instanceof является правильным.

Ответ 2

Если вам нужно сделать это динамически, вы можете использовать следующее,

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

где clazz - это экземпляр Class.

Ответ 3

Используйте оператор instanceof:

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

Ответ 4

Попробуйте оператор instanceof.

Ответ 5

Я согласен с уже упомянутым instanceof.

Дополнительным преимуществом использования instanceof является то, что при использовании с null ссылкой instanceof of вернет false, а a.getClass() будет бросать NullPointerException.

Ответ 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);