Ich würde gerne wissen, wie sich der instanceof
Operator in Java verhält.
interface C {}
class B {}
public class A {
public static void main(String args[]) {
B obj = new B();
System.out.println(obj instanceof A); //Gives compiler error
System.out.println(obj instanceof C); //Gives false as output
}
}
Wieso ist es so? Es gibt keine Beziehung zwischen interface C
und class B
, aber es gibt falsch, während im Falle, wenn es obj instanceof A
Compilerfehler gibt?
java
class
inheritance
interface
instanceof
Ajay Sharma
quelle
quelle
Object obj = new B()
wird es kompiliert.class B
is wirdfinal
dannobj instanceof C
auch nicht kompiliert, da ifB
keine Subtypen haben kann, ist garantiert, dass es keine Beziehung zu hatC
.Antworten:
Da Java keine Vererbung mehrerer Klassen hat, ist während der Kompilierung absolut bekannt, dass ein
obj
Objekt vom TypB
kein Subtyp sein kannA
. Andererseits kann es möglicherweise ein Subtyp der Schnittstelle seinC
, zum Beispiel in diesem Fall:Wenn Sie also nur den
obj instanceof C
Ausdrucks-Compiler betrachten, können Sie nicht im Voraus sagen, ob er wahr oder falsch ist. Wennobj instanceof A
Sie ihn jedoch betrachten , wissen Sie, dass dies immer falsch und somit bedeutungslos ist, und Sie können einen Fehler vermeiden. Wenn Sie diese bedeutungslose Prüfung dennoch in Ihrem Programm haben möchten, können Sie demObject
:quelle
A.class.isAssignableFrom(obj.getClass())
Java has no multiple class inheritance
Ja, ich stimme zu, aber wie wird es in diesem Fall angewendet, weil weder B noch A irgendetwas erweitern. Warum also Mehrfachvererbung hier? Es wäre hilfreich, wenn Sie es erklären können.B extends A
. In meinem Leben musste ich tatsächlich so seltsame Überprüfungen und Besetzungen durchführen, wie es(A)(Object)b
zur Laufzeit tatsächlich möglich war, wahr zu sein.Durch die Verwendung des
final
Modifikators in der folgenden Klassendeklaration wird garantiert, dass es keine Unterklasse von geben kannTest
, die die Schnittstelle implementieren kannFoobar
. In diesem Fall ist es offensichtlich, dassTest
undFoobar
nicht miteinander kompatibel sind:Andernfalls kann es vorkommen, dass eine Unterklasse von die Schnittstelle implementiert , wenn sie
Test
nicht deklariertfinal
istTest
. Und deshalb würde der Compiler die Anweisungtest instanceof Foobar
in diesem Fall zulassen .quelle