2014-01-22 3 views
5

Ich weiß, dass instanceof TRUE zurückgibt, wenn ein Objekt eine Instanz einer bestimmten Klasse ist. Zum Beispiel:Wann wird instanceof FALSE zurückgegeben?

B extends A 
C extends A 

B b = new B(); 
C c = new C(); 

b instanceof A // returns TRUE 

So weit so gut, also lassen Sie uns etwas geben, das wie es falsch zurückgeben sollte erscheinen würde:

c instanceof B // won't compile (error: inconvertible types) 

Diese nicht kompiliert, was Sinn macht, weil es eine Aufsicht erlaubt zur Kompilierzeit abgefangen werden. Aber wenn DOESof tatsächlich falsch zurückgibt? Es scheint, die einzigen beiden Optionen sind WAHR und FEHLER. Die einzige Ausnahme, die ich denken kann, ist dies:

null instanceof A // returns FALSE 

Aber durch die gleiche Logik wie oben, so scheint es, dies auch bei der Kompilierung gefangen werden soll. hier

Was bin ich? Sind wahr/Fehler die einzigen praktischen Optionen, oder ist es möglich, tatsächlich auf eine sinnvollere Art und Weise zurückzukommen, abgesehen davon, dass null als Referenzvariable angegeben wird?

+0

Das Safaris Rechtschreibprüfung ist. Betrachten Sie den obigen Pseudocode. ;) – abc32112

+0

mögliches Duplikat von [Wofür wird der 'instanceof'-Operator verwendet?] (Http://stackoverflow.com/questions/7313559/what-ist-instanceof-operator-used-for) –

+0

'(Object) c instanceof B wird kompiliert. Der Grund, dass "c instanceof B" nicht kompiliert, ist, dass der Compiler statisch feststellen kann, dass ein Verweis auf ein "C" niemals ein "B" sein kann. – Radiodef

Antwort

8

Hier ist ein Beispiel, das als falsch ausgewertet:

class A {} 
class B extends A {} 

A a = new A(); 
a instanceof B // false 

Live-Demo: http://ideone.com/cQltqE.

3

Hier ist ein weiteres Beispiel, das

public static void main(String[] args) { 
    checkType(""); 
} 

static <T> void checkType(T sometype) { 
    System.out.println(sometype instanceof A); 
} 

static class A {} 

Es ist eigentlich nur falsch zurückgibt, wenn (gegossen und dann) zu vergleichen versuchen, einen spezifischeren Typ.

In Ihrem Beispiel

c instanceof A 

macht keinen Sinn, da C der Typ nicht in der Vererbungshierarchie von A ist.

5

Zusätzlich zu den anderen Antworten: jederzeit entweder der Ausdruck auf der linken Seite, oder die Art auf der rechten Seite ist eine Schnittstelle, dann instanceofkönnte wahr sein, so dass der Compiler es zu ermöglichen, hat. Es ist also leicht, Beispiele zu finden, bei denen es falsch wäre.

0
B extends A 
C extends A 

B b = new B(); 
C c = new C(); 

b instanceof A // returns TRUE 
myMethod(b); // has TRUE and then FALSE 
myMethod(c); // has FALSE and then TRUE 

void myMethod(A a){ 
    if(a instanceof B){System.out.println("This is a B");}//first statement 
    if(a instanceof C){System.out.println("This is a C");}//second statement 
} 

Im Aufruf von myMethod(b), wenn die Auswertung in der zweiten Aussage dieser Methode FALSCH sein und Diese ist ein B gedruckt wird. Jedoch in Aufruf von myMethod(c), wenn die Auswertung in der ersten Erklärung dieser Methode wird FALSCH und druckt Dies ist ein C