How to determine an object's class?
if (obj instanceof C) {
//your code
}
Use Object.getClass(). It returns the runtime type of the object.
Multiple right answers were presented, but there are still more methods: Class.isAssignableFrom()
and simply attempting to cast the object (which might throw a ClassCastException
).
Possible ways summarized
Let's summarize the possible ways to test if an object obj
is an instance of type C
:
// 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) {
}
Differences in null
handling
There is a difference in null
handling though:
- In the first 2 methods expressions evaluate to
false
ifobj
isnull
(null
is not instance of anything). - The 3rd method would throw a
NullPointerException
obviously. - The 4th and 5th methods on the contrary accept
null
becausenull
can be cast to any type!
To remember:
null
is not an instance of any type but it can be cast to any type.
Notes
Class.getName()
should not be used to perform an "is-instance-of" test becase if the object is not of typeC
but a subclass of it, it may have a completely different name and package (therefore class names will obviously not match) but it is still of typeC
.- For the same inheritance reason
Class.isAssignableFrom()
is not symmetric:
obj.getClass().isAssignableFrom(C.class)
would returnfalse
if the type ofobj
is a subclass ofC
.