Если класс B
и класс C
расширяют класс A
и у меня есть объект типа B
или C
, как я могу определить, экземпляром какого типа он является?
if (obj instanceof C) {
//your code
}
Используйте Object.getClass(). Он возвращает тип объекта во время выполнения.
Были представлены несколько правильных ответов, но есть еще несколько методов: класса.isAssignableFrom () и просто пытается привести объект (который мог бы бросить исключение ClassCastException
).
Позвольте'ы обобщить возможные пути, чтобы проверить, если объект в obj-это экземпляр типа с
:
// 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) {
}
Есть разница в "нулевой" обработки, хотя:
false
, если в obj
нулевой
(нуль
не является экземпляром чего-либо).исключение NullPointerException
очевидно. нуль
, потому что нуль
может быть приведен к любому типу!, Чтобы вспомнить:
нуль
не является экземпляром какого-либо типа, но это может быть брошен для любого типа.
не должны использоваться для выполнения _"это-экземпляр-и"_ проверить, что если объект имеет тип, отличный от
С`, но подкласс, оно может иметь совершенно другое название и пакет (поэтому имена классов будут явно не соответствовать) но все равно типа "с"..isAssignableFrom()
не symmetric:
в obj.getClass().isAssignableFrom(C.class)
вернет "false", если типа в obj
является подклассом класса "с".Вы можете использовать:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
HTH. Но я думаю, что в большинстве случаев это не очень хорошая практика использовать это для потока управления или чего-то подобного...
Любое использование каких-либо методов, предложенных считается код запах, который базируется в плохой дизайн ОО.
Если ваш проект хорош, вы не должны найти себя необходимости использовать getClass () " или " оператор instanceof`.
Любой из предложенных методов сделает, но просто имейте в виду, дизайну.
Мы можем использовать отражение в этом случае
objectName.getClass().getName();
Например:-
в <предварительно><код>защищенный пустота методом doget(HttpServletRequest запрос, HttpServletResponse ответ) бросает ServletException, исключение IOException {
String name = request.getClass().getName();
}</код></пре>
В этом случае вы получите имя класса, который сдать объект в переменной референтные интерфейса HttpServletRequest`.
Существует также .isInstance
способ о " класса" Класс. если вы получаете объект'S класс через myBanana.getClass () - вы можете увидеть, если сайту myapple ваш объект является экземпляром того же класса, что myBanana
через
myBanana.getClass().isInstance(myApple)
проверка с isinstance () не будет достаточно, если вы хотите знать во время выполнения. использование:
если(someObject.getClass().равно(C.class){ // что-то делать }