2012-12-14 4 views
10

Ich bin nur neugierig, das zu fragen, vielleicht ist es ziemlich bedeutungslos.Java instanceof mit Klassenname

Wenn wir instanceof in Java verwenden, wie:

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

, warum wir nicht wie unten verwenden:

if (a instanceof Parent.class){ 
} 

Hat der zweite 'instanceof' mehr Sinn aus der Sicht machen von strenge Programmierung? Was ist der Unterschied zwischen "Parent" und "Parent.class"?

+0

In Verbindung stehende http://stackoverflow.com/questions/496928/what-ist-difference-between-instanceof-and-class-isassignablefrom –

+0

In Verbindung stehende http://stackoverflow.com/questions/2590640/why-cant -a-class-variable-be-passed-to-instanceof – PeterMmm

+0

Hinweis: Für den zweiten Ansatz wäre 'Parent.class.isInstance (a)' die geeignete Überprüfung. – Vulcan

Antwort

15

Was ist der Unterschied zwischen "Parent" und "Parent.class"?

Letzteres ist ein Klasse literal - ein Weg Class<Parent> ein Objekt des Typs des Zugriffs auf.

Ersteres ist nur der Name einer Klasse, die in verschiedenen Situationen verwendet wird - beim Aufruf von statischen Methoden, Konstrukteure, Gießen usw.

Hat die zweiten ‚instanceof‘ mehr Sinn aus der Sicht macht von strenge Programmierung?

gut nicht wie die Sprache definiert ist - instanceofnur Werke mit dem Namen eines Typs, nie Ausdruck. Wenn Sie könnten schreiben

if (a instanceof Parent.class) 

dann würde ich erwarten Sie schreiben Sie in der Lage:

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

... und das ist einfach nicht die Art, wie es funktioniert. Auf der anderen Seite, ist die Class.isInstance Methode, die Sie aufrufen können, wenn Sie möchten.

Was meinst du mit "die Sicht der strengen Programmierung" an erster Stelle?

1

Parent ist eine Klasse, so macht das zweite Beispiel nicht mehr Sinn, dass der erste. Sie fragen, ob die Instanz eine Instanz der Klasse ist, a instanceof Parent ist ein ziemlich direkter Ausdruck davon.

Parent.class ist ein Instanz von Class, so dass selbst wenn das zweite Beispiel kompiliert (es nicht, die rechte von instanceof kann sich nicht eine Instanz sein), wäre es nicht überprüfen, was Sie wollen überprüfen. :-)

0

Parent ist der Name eines Typs. Parent.class ist im Wesentlichen eine statische Variable, die sich auf ein Objekt bezieht (speziell eine Instanz von Class). Sie möchten fragen, ob a eine Instanz des Typs Parent ist, nicht ob es sich um eine Instanz eines Objekts handelt, das selbst eine Instanz eines anderen Typs ist (Class).

0

Wenn Sie Parent.class schreiben, bedeutet das, dass Sie ein Objekt java.lang.Class für Ihre Elternklasse erstellen. So if (a instanceof Parent.class){ } das wird nicht für Sie arbeiten.

Weitere Informationen zu der Klasse Klasse einen Blick der folgenden Links bringen:
Class

Instanzen der Klasse Klasse repräsentieren Klassen und Schnittstellen in einem laufenden Java-Anwendung. Jedes Array gehört ebenfalls zu einer Klasse, die als ein Klassenobjekt widergespiegelt wird, das von allen Arrays mit demselben Elementtyp und derselben Dimension geteilt wird. Die primitiven Java-Typen (boolean, byte, char, short, int, long, float und double) und das Schlüsselwort void werden ebenfalls als Klassenobjekte dargestellt.

0

Das statische Element Parent.class ist eigentlich ein Objekt. Man könnte es auf eine Variable Object oder Class Typen zuordnen, wenn man will:

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

Parent auf der anderen Seite ist kein Objekt oder eine Variable: Es ist ein Type Name, gemäß der Java-Spezifikation.

Wenn Sie dies tun könnte ...

a instanceof Parent.class 

Da Parent.class ist ein Objekt dann könnte man dies auch tun feasibly könnte:

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

..., die nur dumm ist.