Подтвердить что ты не робот

Как определить класс объекта?

Если класс B и class C расширяют класс A, и у меня есть объект типа B или C, как я могу определить, какой тип является экземпляром?

4b9b3361

Ответ 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
}