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

Есть что-то вроде instanceOf (класс <?> C) в Java?

Я хочу проверить, является ли объект o экземпляром класса C или подкласса C.

Например, если p имеет класс Point, я хочу, чтобы x.instanceOf(Point.class) был true, а также x.instanceOf(Object.class) равным true.

Я хочу, чтобы он работал также для примитивных типов в штучной упаковке. Например, если x является Integer, тогда x.instanceOf(Integer.class) должен быть true.

Есть ли такая вещь? Если нет, как я могу реализовать такой метод?

4b9b3361

Ответ 1

Class.isInstance делает то, что вы хотите.

if (Point.class.isInstance(someObj)){
    ...
}

Конечно, вы не должны использовать его, если можете использовать instanceof вместо этого, но для сценариев отражения это часто пригодится.

Ответ 2

Я хочу проверить, является ли объект o экземпляр класса c или подкласс c. Например, если p класса Точка, которую я хочу x.instanceOf(Point.class)

Ум... Что? Что такое o, p и x?

Я хочу, чтобы он работал и для примитивных типы. Например, если x является целое число x.instanceOf(Integer.class), а также x.instanceOf(Object.class) должен быть правда.

Нет. Он даже не компилируется. Примитивы не являются объектами, и вы не можете вызывать методы на них.

Во всяком случае, есть три вещи, одна из которых может определенно достигать того, чего вы хотите (они несколько отличаются друг от друга тем, где именно применяются:

  • Оператор instanceof, если вы знаете класс во время компиляции.
  • Class.isInstance(), если вы хотите проверить класс объекта на класс, не известный во время компиляции.
  • Class.isAssignableFrom(), если вы хотите проверить назначаемость, заданную двумя объектами класса.

Ответ 3

x instanceof Integer
x instanceof Object

вам просто нужно использовать правильный синтаксис

для типов примитивов, вы должны сделать это совершенно иначе. Поскольку вы не можете создавать методы для них, вам нужен класс, поддерживающий метод. Поэтому вместо "x.instanceOf(Integer.Class)" вы должны вызвать "MyClassComparer.instanceOf(x, Integer.Class)" или что-то в этом роде. Это может быть легко реализовано с помощью методов перегрузки, но я не вижу случая, когда эта функциональность будет желательна вообще.

Ответ 4

Фактически в Java существует логический оператор, называемый instanceof, который может быть использован для определения того, является ли объект экземпляром класса, экземпляром подкласса или экземпляром класса, реализующего определенный интерфейс.

if(obj instanceof SomeClass) {
    // Do something
}

В учебнике Java есть хороший пример этого оператора

Ответ 5

Вы можете сделать:

if (foo instanceof classNameYouWantToCheck) 

Ответ 6

"Я хочу, чтобы он работал и для примитивных типов. Например, если x является целым числом, тогда x.instanceOf(Integer.class), а также x.instanceOf(Object.class) должно быть истинным."

Почему? Примитивные типы и ссылочные типы полностью разделены. Примитивный int не является подтипом Integer или Object. Тип примитивного значения всегда известен статически во время компиляции, поэтому нет смысла тестировать его тип. Конечно, вы можете ввести примитивное значение, а затем проверить его тип:

(Integer)5 instanceof Integer

Но какова была бы точка?

Ответ 7

Я думаю, вы запутались в экземпляре для raw-объектов и общих

obj instanceof Class
obj instanceof Class<?> // this is the one you want