Проверьте, принадлежит ли объект классу в Java
Есть ли простой способ проверить, принадлежит ли объект данному классу? Например, я мог бы сделать
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
но для этого требуется каждый раз создавать новый объект "на лету", только чтобы отбросить его. Есть ли лучший способ проверить, что "a" принадлежит классу "MyClass"?
Ответы
Ответ 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);