Nochmal: instanceof
-
Hallo zusammen,
mir ist leider noch immer nicht so klar, wie instanceof funktioniert. Ich habe Onkel Google durchstöbert, aber eine Lösung, die mir gefällt, war nicht dabei. Ich habe den instanceof Operator so verstanden, dass er prüft, ob ein Objekt obj in der Vererbungshierarchie einer Klasse cl liegt.
if(obj instanceof cl)
Falls obj eine Instanz oder eine Subinstanz von cl ist, dann ergibt der Ausdruck true. Falls obj eine Superinstanz von cl ist, so wird false zurückgegeben.
Wenn jedoch (und das verstehe ich nicht), die Klasse cl gar nichts mit "obj" zu tun hat, dann wird eine Exception geworfen? Warum? Ich verwende doch instanceof gerade dafür, dass ich herausfinde, wie die Beziehung zwischen Objekt und Klasse ist. Was hat das für einen Sinn und kann ich dieses Problem irgendwie umgehen?
Vielen Dank
LG, freakC++
-
Falsch, instanceof wirft keine Exception. Wir kommst Du darauf? Siehe JLS 15.20.2
-
Oh ja, ich sah nur rot in meinem Compiler :D. Aber es wird ein Compilerfehler ausgegeben? Warum?
-
freakC++ schrieb:
Oh ja, ich sah nur rot in meinem Compiler :D. Aber es wird ein Compilerfehler ausgegeben? Warum?
Wie lautet denn der Compiler Fehler? Etwas Code koennte auch nicht schaden.
-
halt nen ganz normaler Compilerfehler:
Unresolved compilation problem:
Incompatible conditional operand types A and StringDie Fehlermeldung ist eindeutig, aber ich dachte instanceof wäre gerade dazu da, um zu prüfen ob obj vom Typ A, vielleicht doch vom Typ String ist....
-
Der entsprechende Cast gibt ja auch einen Compilerfehler, also ist das doch sinnvoll.
-
instanceof funktioniert eben nur mit 2 Operanden, die hierarchisch verwandt sind.
-
314159265358979 schrieb:
instanceof funktioniert eben nur mit 2 Operanden, die hierarchisch verwandt sind.
Also muss ich doch schon was über das Objekt wissen? Mhhmmm....ok
LG, freakC++
-
2 x-beliebige Operanden vergleichen ergibt ja auch keinen Sinn. Das würde ja immer false ergeben.
-
freakC++ schrieb:
Also muss ich doch schon was über das Objekt wissen? Mhhmmm....ok
LG, freakC++
Wen du den Code
class A { // Irgendwas } class B { // Irgendwas }
hast, dann ist der Code
A a = new A(); if ( a instanceof B ) { // Mach was }
nicht sinnvoll, da dies nicht zur Laufzeit sondern bereits zur Compile-Zeit entschieden werden kann.
-
314159265358979 schrieb:
instanceof funktioniert eben nur mit 2 Operanden, die hierarchisch verwandt sind.
Nicht mir irgendwelchen beliebigen Interfaces? Wenn eine Klasse zwei Interfaces implementiert und ich eine mit dem einen Interface getypte Referenz habe, sollte ich auf das andere Interface umcasten können.
-
Mit Interfaces funktioniert es, nicht aber mit Klassen.
http://ideone.com/jvtch
-
Das ist klar.
-
Warum fragst du dann nach?
-
... siehts denn mit isAssignableFrom() aus java.reflect.Class
Bsp:
? x = getAnyObject(); if (x.getClass().isAssignableFrom(String.class)) { // wird ausgeführt wenn x eine Subklasse von String ist. }
das ist doch das was der "freak" scuht..
peac out
-
314159265358979 schrieb:
Warum fragst du dann nach?
Klar ist das, was du unverständlichweise noch hinzugefügt hast: Dass es mit Klassen nicht funktionieren würde.
-
Und du hast unverständlicherweise nicht den Teil gequotet, auf den du dich bezogen hast.
-
Ich bin davon ausgegangen, dass das klar ist.