オブジェクトが特定のクラスに属していることを確認する簡単な方法はありますか?たとえば、
if(a.getClass() = (new MyClass()).getClass())
{
//do something
}
しかし、これは毎回新しいオブジェクトをその場でインスタンス化することを必要とし、それを捨てるだけです。 "a"が "MyClass"クラスに属していることを確認するもっと良い方法はありますか?
回答:
回答№1の132ザ 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
、またはif a
のインスタンスです サブクラス の X
.
ほとんどの時間、 instanceof
は正しい。
答え№2の18
これを動的に行う必要がある場合は、次のものを使用できます。
if (clazz.isInstance(a)) {
// do something
}
どこで clazz
のインスタンスです Class
.
回答№3の16
使用 instanceof
オペレーター:
if(a instanceof MyClass)
{
//do something
}
回答№4の4
オペレータを試す instanceof
.
答え№5の場合は3
の使用に同意します instanceof
すでに述べた。
を使用することの追加の利点 instanceof
と一緒に使うと null
参照 instanceof
のが戻る false
、while a.getClass()
投げるだろう NullPointerException
.
答え№6の2
通常の方法は次のとおりです。
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);