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

87

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

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

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

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

змея
источник
обработка уроков в штучной упаковке немного беспорядочная
dfa

Ответы:

172

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

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

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

Gustafc
источник
6
@ Стыдно, наверное, медленнее, но что еще хуже, это сложнее понять! Если есть очень простой способ сделать что-то вроде if (a instanceof Point)- но вы делаете это более запутанным способом, тот, кто читает код, обязательно подумает: «О, должна быть причина, по которой это делается трудным путем», и затем перейдите к документации, чтобы узнать, чем Class.isInstanceотличается от instanceof. Вы тратите время своих коллег.
gustafc
21

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

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

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

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

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

  • instanceofОператором , если вы знаете , класс во время компиляции.
  • Class.isInstance (), если вы хотите сравнить класс объекта с классом, неизвестным во время компиляции.
  • Class.isAssignableFrom (), если вы хотите проверить возможность назначения для двух объектов класса.
Майкл Боргвардт
источник
9
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 есть хороший пример этого оператора.

Виктор Гюго
источник
1
вы не можете использовать instanceof с примитивными типами
dfa
4
Он путал примитивные типы с объектами. Пожалуйста, прочтите ... «Например, если x является целым числом, тогда x.instanceOf (Integer.class), а также x.instanceOf (Object.class) должны быть истинными». Позор вам, проголосовав против всех ответов
Виктор Хьюго
Второе предложение по использованию Java Tutorial. Это хороший справочник для изучения самого языка.
luis.espinal 02
0

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

if (foo instanceof classNameYouWantToCheck) 
fmsf
источник
вы не можете использовать instanceof с примитивными типами
dfa
Класс должен был показать, что он должен написать здесь имя класса. Я исправлю
fmsf 04
0

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

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

(Integer)5 instanceof Integer

Но какой в ​​этом смысл?

newacct
источник
-2

Я думаю, вы смущены instanceof для необработанных объектов и общих

obj instanceof Class
obj instanceof Class<?> // this is the one you want
Пол Борс
источник
2
Вы не можете использовать универсальные шаблоны в правой части оператора instanceof из-за стирания типа.
Matthias
2
Нет, это вы запутались в этом. После вы должны использовать необработанный тип instanceof.
Давуд ибн Карим