オブジェクトが特定のクラスに属していることを確認する簡単な方法はありますか?たとえば、私はできる
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
しかし、これには、その場で新しいオブジェクトをインスタンス化する必要があり、それを破棄するだけです。 「a」がクラス「MyClass」に属していることを確認するより良い方法はありますか?
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
のsubclassのインスタンスである場合、条件は真です。
ほとんどの場合、instanceof
が正しいです。
instanceof
演算子を使用します。
if(a instanceof MyClass)
{
//do something
}
既に述べたinstanceof
の使用に同意します。
instanceof
を使用することの追加の利点は、null
の参照でinstanceof
を使用するとfalse
を返し、a.getClass()
がスローされることです。 NullPointerException
。
演算子instanceof
を試してください。
通常の方法は次のとおりです。
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);