B
クラスとC
クラスがA
クラスを継承していて、B
型またはC
型のオブジェクトがある場合、どの型がインスタンスであるかをどのように判断できますか?
if (obj instanceof C) {
//your code
}
Object.getClass() を使用してください。オブジェクトの実行時型を返します。
複数の正しい答えが提示されましたが、まだもっと多くの方法があります: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
の処理には違いがあります。
false
がobj
の場合、式はnull
と評価されます(null
は何のインスタンスでもありません)。NullPointerException
をスローします。null
は任意の型にキャストできるので、反対に4番目と5番目のメソッドはnull
を受け入れます。覚えておくべきこと:
null
はどんな型のインスタンスでもありません それは どんな型にでもキャストできます .
C
型ではなくそのサブクラスである場合、 "is-instance-of" テストを実行するためにClass.getName()
を使用しないでください。完全に異なる名前とパッケージ(したがってクラス名)を持つ場合があります。は明らかに一致しませんが、それはまだC
型です。Class.isAssignableFrom()
は 対称 ではありません:false
の型がobj
のサブクラスである場合、obj.getClass().isAssignableFrom(C.class)
はC
を返します。あなたが使用することができます:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTHしかし、私はほとんどの場合、それを制御フローやそれに類似したものに使うのは良い習慣ではないと思います。
提案された方法のいずれの使用もコードの匂いと考えられ、これは悪いOOデザインに基づいています。
あなたのデザインが良いのであれば、getClass()
やinstanceof
を使う必要はないでしょう。
提案された方法のどれでも構いませんが、念頭に置いておくべき設計上の注意事項です。
この場合は反射を使用できます
objectName.getClass().getName();
例: -
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
この場合、オブジェクトがHttpServletRequest
インタフェース参照変数に渡すクラスの名前を取得します。
"Class
"クラスには .isInstance
メソッドもあります。 myBanana.getClass()
を介してオブジェクトのクラスを取得すると、そのオブジェクトのmyApple
がmyBanana
と同じクラスのインスタンスであるかどうかがわかります。
myBanana.getClass().isInstance(myApple)
実行時に知りたい場合、isinstance()
で確認するだけでは十分ではありません。つかいます:
if(someObject.getClass().equals(C.class){
// do something
}