クラスB
とクラスがクラスをC
拡張しA
ていて、タイプB
またはのオブジェクトC
がある場合、それがインスタンスであるタイプをどのように判別できますか?
クラスB
とクラスがクラスをC
拡張しA
ていて、タイプB
またはのオブジェクトC
がある場合、それがインスタンスであるタイプをどのように判別できますか?
回答:
if (obj instanceof C) {
//your code
}
if(!(obj instanceof C))
code
Child1 child1 = new Child1();を試してください。Parent1 parentChild = new Child2(); Child2 child2 = new Child2(); (child1 instanceof Parent1); (child1 instanceof Child1); (parentChild instanceof Child2); (parentChild instanceof Parent1); (parentChild instanceof Child1); code
、instanceofの意図をクリアするかもしれません。
複数の正解が提示されましたが、さらに多くのメソッドがあります。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
if obj
is null
(null
is of何かのインスタンスではない)と評価されます。NullPointerException
明らかにスローします。null
ため受け入れnull
ます!覚えておいてください:
null
はどのタイプのインスタンスでもありませんが、どのタイプにもキャストできます。
Class.getName()
オブジェクトがタイプではなくそのサブクラスである場合、「is-instance-of」テストの実行に使用しないでください。オブジェクトのC
名前とパッケージが完全に異なる可能性があります(したがって、クラス名は明らかに一致しません)。まだタイプC
です。Class.isAssignableFrom()
で対称ではありません:のタイプがのサブクラスである場合にobj.getClass().isAssignableFrom(C.class)
返されます。false
obj
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
インターフェース参照変数に渡すクラスの名前を取得します。
obj.getClass()
を使用すると、className、prefixexという単語が返されますclass
request.getClass().getName();
すべてのパッケージを印刷します!クラス名とともに
.isInstance
" Class
"クラスにはメソッドもあります。オブジェクトのクラスを経由して取得したmyBanana.getClass()
場合、オブジェクトmyApple
がmyBanana
経由と同じクラスのインスタンスであるかどうかを確認できます
myBanana.getClass().isInstance(myApple)
isinstance()
実行時に知りたい場合は、でのチェックだけでは不十分です。使用する:
if(someObject.getClass().equals(C.class){
// do something
}
スイッチケースを使用する必要はなく、Java 8ジェネリックを使用して実行時にオブジェクトインスタンスを取得しました
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
任意のタイプのデータを渡すと、メソッドは、呼び出し中に渡したデータのタイプを出力します。例えば
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
以下は出力です
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []