Warum wird dieser Code nicht kompiliert?
public boolean isOf(Class clazz, Object obj){
if(obj instanceof clazz){
return true;
}else{
return false;
}
}
Warum kann ich keine Klassenvariable übergeben instanceof
?
java
class
instanceof
eric2323223
quelle
quelle
Integer
ist kein Klassenliteral.Integer.class
wäre ein Klassenliteral (siehe § 15.8.2 des JLS: java.sun.com/docs/books/jls/third_edition/html/… ). Derinstanceof
Bediener verwendet einen "ReferenceType" (auch als Typname bezeichnet) gemäß § 15.20.2 des JLS: java.sun.com/docs/books/jls/third_edition/html/…clazz.isInstance(obj)
da das Objekt bereits geliefert wurde.instanceof
kann nur mit expliziten Klassennamen verwendet werden (zur Kompilierungszeit angegeben). Um eine Laufzeitprüfung durchzuführen , sollten Sie Folgendes tun:Dies hat einen kleinen Vorteil gegenüber
clazz.isAssignableFrom(..)
da es den Fallobj == null
besser behandelt.quelle
Wie bereits erwähnt, können Sie eine Klassenvariable nicht übergeben,
instanceof
da eine Klassenvariable auf eine Instanz eines Objekts verweist , während die rechte Hand voninstanceof
ein Typ sein muss . Das heißtinstanceof
nicht, dass "y eine Instanz von Objekt x ist", sondern dass "y eine Instanz vom Typ X ist". Wenn Sie den Unterschied zwischen einem Objekt und einem Typ nicht kennen, beachten Sie Folgendes:Object o = new Object();
Hier ist
Object
undo
ist der Typ ein Verweis auf die Instanz des Objekts mit diesem Typ. So:if(o instanceof Object)
ist aber gültig
if(o instanceof o)
ist nicht weil
o
auf der rechten Seite ein Objekt ist, kein Typ.Genauer gesagt ist eine Klasseninstanz kein Typ, sondern ein Objekt (das von der JVM für Sie erstellt wird). Ist in Ihrer Methode
Class
ein Typ, aberclazz
ein Objekt (also ein Verweis auf ein Objekt)Sie benötigen eine Möglichkeit, ein Objekt mit einem Klassenobjekt zu vergleichen. Es stellt sich heraus, dass dies beliebt ist, sodass es Ihnen als Methode des Klassenobjekts zur Verfügung gestellt wird :
isInstance()
.Hier ist das Java-Dokument für isInstance, das dies besser erklärt:
quelle
Erstens
instanceof
muss der Operand auf der rechten Seite eine tatsächliche Klasse (z. B.obj instanceof Object
oderobj instanceof Integer
) und keine Variable vom Typ seinClass
. Zweitens haben Sie einen ziemlich häufigen Anfängerfehler gemacht, den Sie wirklich nicht tun sollten ... das folgende Muster:Das Obige kann überarbeitet werden in:
Sie sollten dieses Refactoring immer durchführen, da es eine redundante if ... else-Anweisung eliminiert. In ähnlicher Weise kann der Ausdruck auf dasselbe Ergebnis umgestaltet werden.
return conditional_expression ? true : false;
quelle