2012-12-14 13 views
10

私はちょうどこれを尋ねるのが好奇妙です、多分それは全く意味がありません。クラス名のJava instanceof

我々は同じように、Javaでinstanceofを使用している:私たちは以下のように使用することはできませんなぜ

if (a instanceof Parent){ //"Parent" here is a parent class of "a" 
} 

if (a instanceof Parent.class){ 
} 

2番目の 'instanceofはは' の観点から、より多くの意味を成しています厳密なプログラミング? "Parent"と "Parent.class"の違いは何ですか?

+0

関連http://stackoverflow.com/questions/496928/what-is-the-difference-between-instanceof-and-class-isassignablefrom –

+0

関連http://stackoverflow.com/questions/2590640/why-cant -a-class-be-passed-to-instanceof – PeterMmm

+0

注:第2のアプローチでは、 'Parent.class.isInstance(a)'が適切なチェックになります。 – Vulcan

答えて

15

"Parent"と "Parent.class"の違いは何ですか?

後者はクラスリテラルである - タイプClass<Parent>のオブジェクトにアクセスする方法。

前者は、様々な場面で使用されるクラスの名前だけです - 「instanceofは」第二の観点から、より多くの意味を成していますなど

をキャスト静的メソッド、コンストラクタを呼び出すとき厳密なプログラミング?

まあ言語が定義されていないよう

- タイプの名前を持つinstanceofだけ作品、決して表現。あなたは

if (a instanceof Parent.class) 

を書くことができれば、私はあなたが書くことができるん期待:

Class<?> clazz = Parent.class; 
if (a instanceof clazz) 

を...、それはちょうどそれが動作する方法ではありません。一方、は、Class.isInstanceの方法で呼び出すことができます。

最初に「厳密なプログラミングの考え方」とはどういう意味ですか?

1

Parentはクラスなので、2番目の例では最初の方が意味がありません。インスタンスがクラスのインスタンスであるかどうかを確認するには、a instanceof Parentはそれをかなり直接的に表現しています。

Parent.classインスタンスClassなので、コンパイルされ第二の例は、(それは、instanceofの右側には、それ自体がインスタンスすることはできませんしません)、それはチェックしません場合でも、あなたはそれを望むものチェックする。 :-)

0

Parentはタイプの名前です。 Parent.classは、本質的にオブジェクト(具体的にはClassのインスタンス)を参照する静的変数です。 aParentタイプのインスタンスであるかどうかを尋ねます。オブジェクト自体が別のタイプのインスタンス(Class)のインスタンスであるかどうかは問いません。

0

Parent.classと書くと、それはあなたのParentクラスのjava.lang.Classオブジェクトを作成していることを意味します。 だからif (a instanceof Parent.class){ }これはうまくいかないでしょう。

はClassクラスの詳細については、以下のリンクを見てみましょう:クラスClassの
Class

インスタンスは、実行中のJavaアプリケーションのクラスおよびインタフェースを表します。また、すべての配列は、同じ要素タイプと次元数を持つすべての配列で共有されるClassオブジェクトとして反映されるクラスに属します。基本的なJava型(boolean、byte、char、short、int、long、float、double)とキーワードvoidもClassオブジェクトとして表されます。

0

静止しているParent.classメンバーは実際にはオブジェクトです。あなたが望んでいた場合は、タイプObjectまたはタイプClassの変数に割り当てることができます:

Object o = Parent.class; 
Class c = Parent.class; 

Parentを一方のオブジェクトまたは変数ではありません。それがJavaの仕様に従って、Type Nameです。

Cat myCat = new DomesticLonghair(); 
a instanceof myCat; 

...ちょうど愚かである:Parent.class以来

あなたがこれを行うことができれば

...

a instanceof Parent.class 

ははその後、あなたもこれを行うことが実行可能にできオブジェクトです。