Als klasse B
en klasse C
klasse A
uitbreiden en ik heb een object van het type B
of C
, hoe kan ik bepalen van welk type het een instantie is?
Antwoord 1, autoriteit 100%
if (obj instanceof C) {
//your code
}
Antwoord 2, autoriteit 46%
Gebruik Object.getClass (). Het geeft het runtime-type van het object terug.
Antwoord 3, autoriteit 22%
Er werden meerdere juiste antwoorden gegeven, maar er zijn nog meer methoden: Class.isAssignableFrom()
en gewoon proberen het object te casten (wat een ClassCastException
kan opleveren).
Mogelijke manieren samengevat
Laten we de mogelijke manieren samenvatten om te testen of een object obj
een instantie van het type C
is:
// Method #1
if (obj instanceof C)
;
// Method #2
if (C.class.isInstance(obj))
;
// Method #3
if (C.class.isAssignableFrom(obj.getClass()))
;
// Method #4
try {
C c = (C) obj;
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
// Method #5
try {
C c = C.class.cast(obj);
// No exception: obj is of type C or IT MIGHT BE NULL!
} catch (ClassCastException e) {
}
Verschillen in verwerking van null
Er is echter een verschil in de afhandeling van null
:
- In de eerste 2 methoden evalueren expressies tot
false
alsobj
null
is (null
is geen instantie van alles). - De derde methode zou natuurlijk een
NullPointerException
opleveren. - De vierde en vijfde methode accepteren daarentegen
null
omdatnull
naar elk type kan worden gecast!
Om te onthouden:
null
is nieteen instantie van welk type dan ook, maar het kan naar elk type worden gecast.
Opmerkingen
Class.getName()
mag niet worden gebruikt om een “is-instance-of”-test uit te voeren, omdat het object niet van het typeC
maar een subklasse ervan, het kan een geheel andere naam en pakket hebben (daarom zullen klassenamen uiteraard niet overeenkomen), maar het is nog steeds van het typeC
.- Om dezelfde reden van overerving is
Class.isAssignableFrom()
niet symmetrisch:
obj.getClass().isAssignableFrom(C.class)
zoufalse
retourneren als het typeobj
een subklasse is vanC
.
Antwoord 4, autoriteit 4%
U kunt gebruiken:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Maar ik denk dat het meestal geen goede gewoonte is om dat te gebruiken voor controlestroom of iets dergelijks…
Antwoord 5, autoriteit 3%
Elk gebruik van een van de voorgestelde methoden wordt beschouwd als een codegeur die is gebaseerd op een slecht OO-ontwerp.
Als je ontwerp goed is, zou je niet moeten merken dat je getClass()
of instanceof
hoeft te gebruiken.
Elk van de voorgestelde methoden is voldoende, maar het is iets om in gedachten te houden, qua ontwerp.
Antwoord 6, autoriteit 2%
In dit geval kunnen we reflectie gebruiken
objectName.getClass().getName();
Voorbeeld:-
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
In dit geval krijgt u de naam van de klasse die door het object wordt doorgegeven aan de interface-referentievariabele HttpServletRequest
.
Antwoord 7, autoriteit 2%
Er is ook een .isInstance
methode op de “Class
” klasse. als je de klasse van een object via myBanana.getClass()
krijgt, kun je zien of je object myApple
een instantie is van dezelfde klasse als myBanana
via
myBanana.getClass().isInstance(myApple)
Antwoord 8
controleren met isinstance()
zou niet voldoende zijn als je het tijdens runtime wilt weten.
gebruik:
if(someObject.getClass().equals(C.class){
// do something
}
Antwoord 9
Ik heb Java 8-generieke middelen gebruikt om te achterhalen wat de objectinstantie is tijdens runtime in plaats van switch-case te moeten gebruiken
public <T> void print(T data) {
System.out.println(data.getClass().getName()+" => The data is " + data);
}
geef elk type gegevens door en de methode zal het type gegevens afdrukken dat u hebt doorgegeven tijdens het aanroepen ervan. bijv.
String str = "Hello World";
int number = 10;
double decimal = 10.0;
float f = 10F;
long l = 10L;
List list = new ArrayList();
print(str);
print(number);
print(decimal);
print(f);
print(l);
print(list);
Hier volgt de uitvoer
java.lang.String => The data is Hello World
java.lang.Integer => The data is 10
java.lang.Double => The data is 10.0
java.lang.Float => The data is 10.0
java.lang.Long => The data is 10
java.util.ArrayList => The data is []
Antwoord 10
Ik gebruik de blaasfunctie in mijn GeneralUtils-klasse, controleer of dit nuttig kan zijn
public String getFieldType(Object o) {
if (o == null) {
return "Unable to identify the class name";
}
return o.getClass().getName();
}
Antwoord 11
U kunt getSimpleName()gebruiken.
Stel dat we een object hebben: Hond d = new Dog(),
Het onderstaande statement kunnen we gebruiken om de klassenaam te krijgen: Dog. Bijv.:
d.getClass().getSimpleName();// return String ‘Hond’.
PS: d.getClass() geeft je de volledige naam van je object.