web-dev-qa-db-ja.com

オブジェクトがJavaのクラスに属しているかどうかを確認します

オブジェクトが特定のクラスに属していることを確認する簡単な方法はありますか?たとえば、私はできる

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

しかし、これには、その場で新しいオブジェクトをインスタンス化する必要があり、それを破棄するだけです。 「a」がクラス「MyClass」に属していることを確認するより良い方法はありますか?

63
chimeracoder

instanceofキーワードは、他の回答で説明されているように、通常は必要なものです。 instanceofは、スーパークラスに対してもtrueを返すことに注意してください。

オブジェクトがクラスの直接のインスタンスであるかどうかを確認する場合は、クラスを比較できます。 getClass()を介してインスタンスのクラスオブジェクトを取得できます。また、ClassName.classを介して特定のクラスに静的にアクセスできます。

たとえば、次のとおりです。

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

上記の例では、aXのインスタンスである場合、条件は真ですが、aXのサブクラスのインスタンスではありません。

比較において:

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

instanceofの例では、aXのインスタンスである場合、またはaXsubclassのインスタンスである場合、条件は真です。

ほとんどの場合、instanceofが正しいです。

156
dhm

これを動的に行う必要がある場合は、次を使用できます。

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

ここで、clazzClass のインスタンスです。

21
gdejohn

instanceof 演算子を使用します。

if(a instanceof MyClass)
{
    //do something
}
16
Jacob Relkin

既に述べたinstanceofの使用に同意します。

instanceofを使用することの追加の利点は、nullの参照でinstanceofを使用するとfalseを返し、a.getClass()がスローされることです。 NullPointerException

4
Justin Muller

演算子instanceofを試してください。

4
Kos

通常の方法は次のとおりです。

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);
2
Martin Konicek