web-dev-qa-db-ja.com

オブジェクトのクラスを決定する方法

BクラスとCクラスがAクラスを継承していて、B型またはC型のオブジェクトがある場合、どの型がインスタンスであるかをどのように判断できますか?

472
carrier
if (obj instanceof C) {
//your code
}
745
IAdapter

Object.getClass() を使用してください。オブジェクトの実行時型を返します。

315
Bill the Lizard

複数の正しい答えが提示されましたが、まだもっと多くの方法があります:Class.isAssignableFrom()そして単にオブジェクトをキャストしようとすること(それはClassCastExceptionを投げるかもしれません)。

考えられる方法のまとめ

オブジェクトobjが型Cのインスタンスであるかどうかをテストするための考えられる方法を要約しましょう:

// Method #1
if (obj instanceof C)
    ;

// Method #2
if (C.class.isInstance(obj))
    ;

// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
    ;

// Method #4
try {
    C c = (C) obj;
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

// Method #5
try {
    C c = C.class.cast(obj);
    // No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}

null処理の違い

nullの処理には違いがあります。

  • 最初の2つのメソッドでは、falseobjの場合、式はnullと評価されます(nullは何のインスタンスでもありません)。
  • 3番目のメソッドは明らかにNullPointerExceptionをスローします。
  • nullは任意の型にキャストできるので、反対に4番目と5番目のメソッドはnullを受け入れます。

覚えておくべきこと:null はどんな型のインスタンスでもありません それは どんな型にでもキャストできます .

ノート

  • オブジェクトがC型ではなくそのサブクラスである場合、 "is-instance-of" テストを実行するためにClass.getName()を使用しないでください。完全に異なる名前とパッケージ(したがってクラス名)を持つ場合があります。は明らかに一致しませんが、それはまだC型です。
  • 同じ継承の理由でClass.isAssignableFrom() 対称 ではありません:
    falseの型がobjのサブクラスである場合、obj.getClass().isAssignableFrom(C.class)Cを返します。
154
icza

あなたが使用することができます:

Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object

HTHしかし、私はほとんどの場合、それを制御フローやそれに類似したものに使うのは良い習慣ではないと思います。

31
Johannes Weiss

提案された方法のいずれの使用もコードの匂いと考えられ、これは悪いOOデザインに基づいています。

あなたのデザインが良いのであれば、getClass()instanceofを使う必要はないでしょう。

提案された方法のどれでも構いませんが、念頭に置いておくべき設計上の注意事項です。

24
Yuval Adam

この場合は反射を使用できます

objectName.getClass().getName();

例: -

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    String name = request.getClass().getName();
}

この場合、オブジェクトがHttpServletRequestインタフェース参照変数に渡すクラスの名前を取得します。

15
user1884500

"Class"クラスには .isInstance メソッドもあります。 myBanana.getClass()を介してオブジェクトのクラスを取得すると、そのオブジェクトのmyApplemyBananaと同じクラスのインスタンスであるかどうかがわかります。

myBanana.getClass().isInstance(myApple)
13

実行時に知りたい場合、isinstance()で確認するだけでは十分ではありません。つかいます:

if(someObject.getClass().equals(C.class){
    // do something
}
1
Alon Gouldman