Wenn Klasse B
und Klasse Klasse C
erweitern A
und ich ein Objekt vom Typ B
oder habe C
, wie kann ich feststellen, von welchem Typ es sich um eine Instanz handelt?
java
inheritance
Träger
quelle
quelle
Antworten:
quelle
if(!(obj instanceof C))
code
Child1 child1 = new Child1 (); Parent1 parentChild = new Child2 (); Child2 child2 = new Child2 (); (child1-Instanz von Parent1); (child1 Instanz von Child1); (parentChild-Instanz von Child2); (parentChild-Instanz von Parent1); (parentChild-Instanz von Child1);code
kann es die Absicht der Instanz von löschen.Verwenden Sie Object.getClass () . Es gibt den Laufzeittyp des Objekts zurück.
quelle
Es wurden mehrere richtige Antworten präsentiert, aber es gibt noch mehr Methoden:
Class.isAssignableFrom()
und einfach zu versuchen, das Objekt zu werfen (was ein werfen könnteClassCastException
).Mögliche Wege zusammengefasst
Lassen Sie uns die möglichen Möglichkeiten zum Testen zusammenfassen, ob ein Objekt
obj
eine Instanz vom Typ istC
:Unterschiede in der
null
HandhabungEs gibt jedoch einen Unterschied in der
null
Handhabung:false
wennobj
istnull
(null
nicht Instanz von irgendetwas ist).NullPointerException
offensichtlich einen werfen .null
weilnull
auf jeden Typ gegossen werden kann!Anmerkungen
Class.getName()
sollte nicht verwendet werden, um einen "is-instance-of" -Test durchzuführen, da das Objekt, wenn es nicht vom Typ,C
sondern von einer Unterklasse ist, möglicherweise einen völlig anderen Namen und ein anderes Paket hat (daher stimmen Klassennamen offensichtlich nicht überein) immer noch vom TypC
.Class.isAssignableFrom()
ist der Vererbungsgrund nicht symmetrisch :obj.getClass().isAssignableFrom(C.class)
würde zurückgeben,false
wenn der Typ vonobj
eine Unterklasse von istC
.quelle
Sie können verwenden:
HTH. Aber ich denke, die meiste Zeit ist es keine gute Praxis, dies für den Kontrollfluss oder ähnliches zu verwenden ...
quelle
Jede Verwendung einer der vorgeschlagenen Methoden wird als Codegeruch betrachtet, der auf einem schlechten OO-Design beruht.
Wenn Ihr Design gut ist, sollten Sie nicht feststellen, dass Sie
getClass()
oder verwenden müsseninstanceof
.Jede der vorgeschlagenen Methoden reicht aus, aber nur etwas, das Sie in Bezug auf das Design beachten sollten.
quelle
In diesem Fall können wir Reflexion verwenden
Beispiel:-
In diesem Fall erhalten Sie den Namen der Klasse, die das Objekt an die
HttpServletRequest
Schnittstellenreferenzvariable übergibt.quelle
obj.getClass()
wird der Klassenname, Präfixex durch das Wortclass
request.getClass().getName();
druckt alle Pakete! zusammen mit KlassennamenEs gibt auch eine
.isInstance
Methode für dieClass
Klasse " ". Wenn Sie die Klasse eines Objekts über erhaltenmyBanana.getClass()
, können Sie sehen, ob Ihr ObjektmyApple
eine Instanz derselben Klasse wiemyBanana
über istquelle
Das Überprüfen mit
isinstance()
würde nicht ausreichen, wenn Sie zur Laufzeit wissen möchten. verwenden:quelle
Ich verwende die Blow-Funktion in meiner GeneralUtils-Klasse. Überprüfen Sie, ob sie nützlich sein kann
quelle
Ich habe Java 8-Generika verwendet, um die Objektinstanz zur Laufzeit abzurufen, anstatt Switch Case verwenden zu müssen
Übergeben Sie einen beliebigen Datentyp, und die Methode druckt den Datentyp, den Sie beim Aufrufen übergeben haben. z.B
Es folgt die Ausgabe
quelle