Если класс B
и class C
расширяют класс A
, и у меня есть объект типа B
или C
, как я могу определить, какой тип является экземпляром?
Как определить класс объекта?
Ответ 1
if (obj instanceof C) {
//your code
}
Ответ 2
Используйте Object.getClass(). Он возвращает тип времени выполнения объекта.
Ответ 3
Были представлены несколько правильных ответов, но есть еще несколько методов: Class.isAssignableFrom()
и просто попытка бросить объект (который может вызвать ClassCastException
).
Возможные способы суммирования
Обобщите возможные способы проверки, является ли объект obj
экземпляром типа 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) {
}
Различия в обработке null
В обработке null
есть разница:
- В первых двух методах выражения оцениваются до
false
, еслиobj
естьnull
(null
не является экземпляром чего-либо). - 3-й метод явно выкинет
NullPointerException
. - 4-й и 5-й методы, наоборот, принимают
null
, потому чтоnull
может быть применено к любому типу!
Помните:
null
не экземпляр любого типа, но может быть отличен для любого типа.
Примечания
-
Class.getName()
не должен использоваться для выполнения теста "is-instance-of", потому что если объект не имеет типC
, а является его подклассом, он может иметь совершенно другое имя и пакет (поэтому класс имена, очевидно, не совпадают), но он по-прежнему имеет типC
. - Для той же причины наследования
Class.isAssignableFrom()
не является симметричным:obj.getClass().isAssignableFrom(C.class)
вернетfalse
, если типobj
является подклассомC
.
Ответ 4
Вы можете использовать:
Object instance = new SomeClass();
instance.getClass().getName(); //will return the name (as String) (== "SomeClass")
instance.getClass(); //will return the SomeClass' Class object
НТН. Но я думаю, что большую часть времени это не хорошая практика, чтобы использовать это для потока управления или что-то подобное...
Ответ 5
Любое использование любого из предложенных методов считается запахом кода, который основан на плохом дизайне OO.
Если ваш дизайн хорош, вам не нужно будет использовать getClass()
или instanceof
.
Любой из предложенных методов будет делать, а просто что-то, что нужно иметь в виду, конструктивно.
Ответ 6
В этом случае мы можем использовать отражение
objectName.getClass().getName();
Пример: -
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getClass().getName();
}
В этом случае вы получите имя класса, объект которого переходит в переменную refference HttpServletRequest
.
Ответ 7
Существует также метод .isInstance
в классе "Class
". если вы получаете класс объекта через myBanana.getClass()
, вы можете увидеть, является ли ваш объект myApple
экземпляром того же класса, что и myBanana
через
myBanana.getClass().isInstance(myApple)
Ответ 8
Проверка с помощью isinstance()
будет недостаточной, если вы хотите знать это во время выполнения. использовать:
if(someObject.getClass().equals(C.class){
// do something
}